आपने एक पाइपलाइन फ़ंक्शन को परिभाषित किया है, और इसे कॉल करने का यह तरीका नहीं है:
SQL> begin
2 Cursor_pkg_func.f_trans(5);
3 end;
4 /
Cursor_pkg_func.f_trans(5);
*
ERROR at line 2:
ORA-06550: line 2, column 1:
PLS-00221: 'F_TRANS' is not a procedure or is undefined
ORA-06550: line 2, column 1:
PL/SQL: Statement ignored
SQL>
आपको एक टेबल() फ़ंक्शन का उपयोग करने की आवश्यकता है। हालांकि तब आप अपने कोड में बग खोज लेंगे:
SQL> select * from table(Cursor_pkg_func.f_trans(5))
2 /
SMITH
SMITH
SMITH
''''
SMITH
SMITH
SMITH
SMITH
ERROR:
ORA-00028: your session has been killed
273660 rows selected.
SQL>
नोट मुझे उस सत्र को दूसरे सत्र से मारना था, अन्यथा यह अभी भी चल रहा होगा। तो चलिए फ़ंक्शन को सरल करते हैं और उस व्यर्थ दूसरे लूप से छुटकारा पाते हैं ....
CREATE OR REPLACE PACKAGE BODY Cursor_pkg_func IS
FUNCTION f_trans (p in number) RETURN outrecset PIPELINED IS
out_rec outrec_typ;
BEGIN
OPEN Cursor_pkg.C1;
LOOP
FETCH Cursor_pkg.C1 INTO Cursor_pkg.row_emp;
EXIT when Cursor_pkg.C1%NOTFOUND;
out_rec.var_char2 := Cursor_pkg.row_emp.last_name;
PIPE ROW(out_rec);
END LOOP;
CLOSE Cursor_pkg.C1;
RETURN;
END f_trans;
END Cursor_pkg_func;
/
.... तो लो!
SQL> select * from table(Cursor_pkg_func.f_trans(5))
2 /
VAR_CHAR2
------------------------------
ADAMS
JAMES
MILLER
SMITH
SQL>
आपने एक पाइपलाइन फ़ंक्शन बनाया है। आपने ऐसा क्यों किया? आपको ऐसा करने का कारण यह था कि आप एक पीएल/एसक्यूएल फ़ंक्शन चाहते थे जिसका उपयोग एक सेलेक्ट स्टेटमेंट के FROM क्लॉज में किया जा सकता था। पाइपलाइन किए गए कार्यों के लिए यह उपयोग का मामला है। इसलिए कॉल को किसी अनाम PL/SQL ब्लॉक में डालने का वास्तव में कोई मतलब नहीं है।
लेकिन वैसे भी।
कृपया दस्तावेज़ीकरण पढ़ें। यह काफी व्यापक है, यह ऑनलाइन और मुफ़्त है। पीएल/एसक्यूएल संदर्भ में प्रासंगिक खंड स्टेटिक एसक्यूएल पर अध्याय है। यह स्पष्ट करता है कि PL/SQL में सेलेक्ट स्टेटमेंट हमेशा होना चाहिए कुछ विवरण के एक चर में रिकॉर्ड प्राप्त करें। बेनामी पीएल/एसक्यूएल ब्लॉक इस संबंध में संग्रहीत प्रक्रियाओं के समान ही हैं। और जानें .