sql >> データベース >  >> RDS >> Oracle

制約の列名を返す関数を作成するにはどうすればよいですか?

    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内のステートメント 、btw LOOP この現在のケースを使用する場合は必要ありません。
    • コマンドPRINT DBMS_OUTPUT.PUT_LINEの代わりに使用できます SYS_REFCURSORの結果を返すため 。


    1. Oracleスキーマのユーザーにすべての権限を付与する

    2. CSVデータをPostgreSQLテーブルにロードする

    3. 特定のタイムゾーンでタイムスタンプフィールドをISO8601文字列に変換するにはどうすればよいですか?

    4. ORA-00904:このインスタンスでは識別子が無効です