Oracle
 sql >> база данни >  >> RDS >> Oracle

PL/SQL - изпълнение незабавно в конвейерна функция

Възможно е да се комбинира динамичен SQL и конвейерна функция, но типът на връщане няма да бъде динамичен:броят и типът на върнатите колони ще бъдат фиксирани.

Можете да използвате EXECUTE IMMEDIATE с BULK COLLECT (благодаря @be here now ), динамични курсори или 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 Injection .



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL избира редове по най-нова дата с две уникални колони

  2. SQL Как да изберете най-новия елемент от датата

  3. shell скрипт за намиране на име на файл и брой редове на всеки файл, сега вмъкнете този запис в таблицата на Oracle

  4. oracle как да променя таблица добавяне на дял по диапазон интервал

  5. скаларна подзаявка в израза if Условие в PL/SQL