【PL/SQL】 SELECTカーソル操作 | 725番のブログ

725番のブログ

With The Diary, The Family, The Work, The Life, And It ...

【PL/SQL】 SELECTカーソル操作


SELECT文を作成して、

カーソル操作を行う例です


■例

CREATE OR REPLACE FUNCTION FUN_TEST RETURN VARCHAR2
IS


 /* 変数定義 */
 WK_SQL VARCHAR2(2048) := '';
 REC_TABLE VARCHAR2(100) := '';
 REC_INDEX VARCHAR2(100) := '';
 REC_COLUMN VARCHAR2(100) := '';
 REC_CONSTRAINT VARCHAR2(100) := '';


 /* カーソル定義 */
 TYPE WK_CURTYPE IS REF CURSOR;

 CUR_SQL WK_CURTYPE;


 /* レコード定義 */
 TYPE WK_REC IS RECORD(
  TABLE_NAME USER_IND_COLUMNS.TABLE_NAME%TYPE,
  INDEX_NAME USER_IND_COLUMNS.INDEX_NAME%TYPE,
  COLUMN_NAME USER_IND_COLUMNS.COLUMN_NAME%TYPE,
  CONSTRAINT_NAME USER_CONSTRAINTS.CONSTRAINT_NAME%TYPE
  );
 WK_CUR WK_REC;


BEGIN


 /* SQL文 */
 WK_SQL := '';
 WK_SQL := TRIM(WK_SQL) || ' ' || 'SELECT';
 WK_SQL := TRIM(WK_SQL) || ' ' || ' a.TABLE_NAME';
 WK_SQL := TRIM(WK_SQL) || ' ' || ',a.INDEX_NAME';
 WK_SQL := TRIM(WK_SQL) || ' ' || ',b.COLUMN_NAME';
 WK_SQL := TRIM(WK_SQL) || ' ' || ',c.CONSTRAINT_NAME';
 WK_SQL := TRIM(WK_SQL) || ' ' || 'FROM';
 WK_SQL := TRIM(WK_SQL) || ' ' || ' USER_INDEXES a';
 WK_SQL := TRIM(WK_SQL) || ' ' || ',USER_IND_COLUMNS b';
 WK_SQL := TRIM(WK_SQL) || ' ' || ',USER_CONSTRAINTS c';
 WK_SQL := TRIM(WK_SQL) || ' ' || 'WHERE';
 WK_SQL := TRIM(WK_SQL) || ' ' || ' b.INDEX_NAME = a.INDEX_NAME';
 WK_SQL := TRIM(WK_SQL) || ' ' || 'AND';
 WK_SQL := TRIM(WK_SQL) || ' ' || ' c.INDEX_NAME(+) = a.INDEX_NAME';
 WK_SQL := TRIM(WK_SQL) || ' ' || 'ORDER BY';
 WK_SQL := TRIM(WK_SQL) || ' ' || ' c.CONSTRAINT_NAME';
 WK_SQL := TRIM(WK_SQL) || ' ' || ',a.INDEX_NAME';
 WK_SQL := TRIM(WK_SQL) || ' ' || ',b.COLUMN_POSITION';


 /* カーソルオープン */
 OPEN CUR_SQL FOR WK_SQL;


 /* データ */
 LOOP


  /* 読込 */
  FETCH CUR_SQL INTO WK_CUR;


  /* 対象データなし */
  EXIT WHEN CUR_SQL%notfound;


  /* データセット */
  REC_TABLE := TRIM(WK_CUR.TABLE_NAME);
  REC_INDEX := TRIM(WK_CUR.INDEX_NAME);
  REC_COLUMN := TRIM(WK_CUR.COLUMN_NAME);
  REC_CONSTRAINT := TRIM(WK_CUR.CONSTRAINT_NAME);
 END LOOP;


 /* カーソルクローズ */
 CLOSE CUR_SQL;


 /* 戻り値 */
 RETURN '';


/* エラー処理 */
EXCEPTION
WHEN CURSOR_ALREADY_OPEN THEN


 /* オープンされている場合 */
 IF (CUR_SQL%ISOPEN = TRUE) THEN


  /* カーソルクローズ */
  CLOSE CUR_SQL;
 END IF;


 /* 戻り値 */
 RETURN SQLERRM;


WHEN OTHERS THEN


 /* オープンされている場合 */
 IF (CUR_SQL%ISOPEN = TRUE) THEN


  /* カーソルクローズ */
  CLOSE CUR_SQL;
 END IF;


 /* 戻り値 */
 RETURN SQLERRM;
END;