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

PL/SQL-パイプライン関数で即時実行

    動的SQLとパイプライン関数を組み合わせることができますが、返されるタイプは動的ではありません。返される列の数とタイプは固定されます。

    EXECUTE IMMEDIATE> BULK COLLECTを使用 ( @be herenow に感​​謝します )、動的カーソル または DBMS_SQL 複数の行を返します。動的カーソルを使用した例を次に示します。

    SQL> CREATE OR REPLACE PACKAGE pkg AS
      2     TYPE test_tab IS TABLE OF test%ROWTYPE;
      3     FUNCTION dynamic_cursor(l_where VARCHAR2) RETURN test_tab PIPELINED;
      4  END;
      5  /
    
    Package created.
    
    SQL> CREATE OR REPLACE PACKAGE BODY pkg IS
      2     FUNCTION dynamic_cursor(l_where VARCHAR2) RETURN test_tab PIPELINED IS
      3        cc sys_refcursor;
      4        l_row test%ROWTYPE;
      5     BEGIN
      6        OPEN cc FOR 'SELECT * FROM test WHERE ' || l_where;
      7        LOOP
      8           FETCH cc INTO l_row;
      9           EXIT WHEN cc%NOTFOUND;
     10           PIPE ROW (l_row);
     11        END LOOP;
     12        RETURN;
     13     END;
     14  END;
     15  /
    
    Package body created.
    

    この動的関数を呼び出しましょう:

    SQL> SELECT *
      2    FROM TABLE(pkg.dynamic_cursor('id <= 2'));
    
            ID DAT
    ---------- ---
             1 xxx
             2 xxx
    

    動的SQLの場合と同様に、SQLインジェクション に注意してください。 。



    1. ASP.NETコアアプリケーションをSQLServerのローカルインスタンスに接続する

    2. コードカバレッジ統計

    3. 単一のトリガー手順を多くの異なるテーブルに適用します

    4. PostgreSQL-LIMITOFFSETから行を繰り返す