Bạn đã xác định một hàm pipelined và đây không phải là cách để gọi nó:
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>
Bạn cần sử dụng hàm TABLE (). Mặc dù sau đó bạn sẽ phát hiện ra lỗi trong mã của mình:
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>
Lưu ý rằng tôi phải ngắt phiên đó khỏi phiên khác, nếu không phiên đó sẽ vẫn chạy. Vì vậy, hãy đơn giản hóa hàm và loại bỏ vòng lặp thứ hai vô nghĩa đó ....
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;
/
.... thì lo!
SQL> select * from table(Cursor_pkg_func.f_trans(5))
2 /
VAR_CHAR2
------------------------------
ADAMS
JAMES
MILLER
SMITH
SQL>
Bạn đã tạo một hàm pipelined. Tại sao bạn làm vậy? Lý do bạn nên làm điều đó là vì bạn muốn một hàm PL / SQL có thể được sử dụng trong mệnh đề FROM của câu lệnh SELECT. Đó là trường hợp sử dụng cho các hàm pipelined. Vì vậy, đặt lệnh gọi vào một khối PL / SQL ẩn danh thực sự không có ý nghĩa.
Nhưng dù sao đi nữa.
Vui lòng đọc tài liệu. Nó khá toàn diện, nó trực tuyến và miễn phí. Phần thích hợp trong Tham chiếu PL / SQL là chương về SQL tĩnh. Rõ ràng rằng các câu lệnh SELECT trong PL / SQL phải luôn luôn tìm nạp các bản ghi vào một biến của một số mô tả. Các khối PL / SQL ẩn danh cũng giống như các thủ tục được lưu trữ về mặt này. Tìm hiểu thêm .