डायनेमिक SQL और पाइपलाइन फ़ंक्शन को संयोजित करना संभव है, लेकिन रिटर्न प्रकार डायनेमिक नहीं होगा:लौटाए गए कॉलम की संख्या और प्रकार तय हो जाएंगे।
आप तत्काल निष्पादितकोड का उपयोग कर सकते हैं>
बल्क कलेक्ट
. के साथ (धन्यवाद @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 से सावधान रहें ।