Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

PL/SQL - jalankan langsung dalam fungsi pipelined

Dimungkinkan untuk menggabungkan fungsi SQL dan pipelined dinamis tetapi tipe pengembalian tidak akan dinamis:jumlah dan tipe kolom yang dikembalikan akan diperbaiki.

Anda dapat menggunakan EXECUTE IMMEDIATE dengan BULK COLLECT (terima kasih @be here now ), kursor dinamis atau DBMS_SQL untuk mengembalikan lebih dari satu baris. Berikut ini contoh dengan kursor dinamis:

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.

Mari kita panggil fungsi dinamis ini:

SQL> SELECT *
  2    FROM TABLE(pkg.dynamic_cursor('id <= 2'));

        ID DAT
---------- ---
         1 xxx
         2 xxx

Seperti biasa dengan SQL dinamis, waspadalah terhadap Injeksi SQL .



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Mengembalikan 'tabel' (tanpa menentukan nama kolom sebelumnya) dari fungsi PL/SQL

  2. Bisakah saya mengubah baris tanggal menjadi kolom tanpa harus menentukan tanggal di pivot? Oracle SQL

  3. Apakah PL/SQL memiliki StringTokenizer yang setara dengan Java?

  4. Bagaimana cara meningkatkan ukuran buffer di Oracle SQL Developer untuk melihat semua catatan?

  5. cara menemukan semua indeks dan kolomnya untuk tabel, tampilan, dan sinonim di oracle