Anda telah mendefinisikan fungsi pipelined, dan ini bukan cara untuk memanggilnya:
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>
Anda perlu menggunakan fungsi TABLE(). Meskipun kemudian Anda akan menemukan bug dalam kode Anda:
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>
Catatan saya harus mematikan sesi itu dari sesi lain, jika tidak maka akan tetap berjalan. Jadi mari kita sederhanakan fungsinya dan singkirkan loop kedua yang tidak berguna itu ....
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;
/
.... lalu lo!
SQL> select * from table(Cursor_pkg_func.f_trans(5))
2 /
VAR_CHAR2
------------------------------
ADAMS
JAMES
MILLER
SMITH
SQL>
Anda telah membuat fungsi pipelined. Kenapa kau melakukan itu? Alasan Anda seharusnya melakukannya adalah karena Anda menginginkan fungsi PL/SQL yang dapat digunakan dalam klausa FROM dari pernyataan SELECT. Itu adalah kasus penggunaan untuk fungsi pipelined. Jadi menempatkan panggilan ke blok PL/SQL anonim benar-benar tidak masuk akal.
Tapi bagaimanapun juga.
Silakan baca dokumentasi. Ini cukup komprehensif, online dan gratis. Bagian terkait dalam Referensi PL/SQL adalah bab tentang SQL Statis. Jelas bahwa pernyataan SELECT dalam PL/SQL harus selalu mengambil catatan ke dalam variabel dari beberapa deskripsi. Blok PL/SQL anonim sama dengan prosedur tersimpan dalam hal ini. Cari tahu lebih lanjut .