Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

CHỌN Dữ liệu TỪ CURSOR của GÓI, in nó

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 .




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. thực hiện trình tự thay đổi ngay lập tức không hoạt động

  2. SQL không phải là một hàm nhóm nhóm đơn

  3. LongOpsWatcher trong SQL Dev

  4. Tại sao tôi nhận được Ngoại lệ OutOfRange trong Hàm GetOrdinal của trường CLOB này?

  5. Oracle - Nhập dữ liệu vào một bảng với một tên khác?