sql >> Databáze >  >> RDS >> Oracle

PL/SQL - okamžité provedení v zřetězené funkci

Je možné kombinovat dynamické SQL a zřetězené funkce, ale návratový typ nebude dynamický:počet a typ vrácených sloupců bude pevný.

Můžete použít EXECUTE IMMEDIATE s BULK COLLECT (díky @buďte teď tady ), dynamické kurzory nebo DBMS_SQL vrátit více než jeden řádek. Zde je příklad s dynamickým kurzorem:

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.

Nazvěme tuto dynamickou funkci:

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

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

Jako vždy u dynamického SQL si dejte pozor na vložení SQL .



  1. (Oracle SQL) Zachycení jedinečné chyby omezení

  2. LINQ Použijte jako místo (( NVL(INSTR(x, y), 0) ) =1)

  3. připojení externí databáze mysql s php

  4. Mám potíže s přesunem své aplikace rails do Heroku/získání instalace drahokamu 'pg'?