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;
|