SYS_REFCURSORを使用できます VARCHAR2などの標準の内部データ型の代わりに あなたの場合のように、複数の行を返すことができるようにするために。 INTO句を含むSELECTステートメントは、複数の行と現在のエラーメッセージ( ORA-01422 )を返すことはできません。 )投げる。
したがって、 SYS_REFCURSORを含むストアド関数を作成します 最初:
SQL> CREATE OR REPLACE FUNCTION GET_CONSTRAINT_COLUMNS(iTableName IN VARCHAR2,
iConstraintName IN VARCHAR2)
RETURN SYS_REFCURSOR AS
wkeys SYS_REFCURSOR;
v_sql VARCHAR2(32767);
BEGIN
v_sql := 'SELECT column_name
FROM user_cons_columns
WHERE constraint_name = :ic
AND table_name = :it';
OPEN wkeys FOR v_sql USING iconstraintname, iTableName;
RETURN wkeys;
END;
/
次に、SQLDeveloperのコンソールから
として呼び出します。SQL> DECLARE
wConsumable SYS_REFCURSOR;
BEGIN
:wConsumable := GET_CONSTRAINT_COLUMNS('PRODUCTS', 'PRODUCTSPK');
END;
/
SQL> PRINT wConsumable ;
- 最初のSQL(
CURSOR Extract_KEY)冗長です; - 2つの
SELECTに違いはありませんLOOP内のステートメント 、btwLOOPこの現在のケースを使用する場合は必要ありません。 - コマンド
PRINTDBMS_OUTPUT.PUT_LINEの代わりに使用できますSYS_REFCURSORの結果を返すため 。