2015-09-10 26 views
5

Tôi muốn kiểm tra chức năng pipelined của mình mà không cần tạo gói. Ví dụ sau đây được đơn giản hóa:PLS-00231: Chức năng có thể không được sử dụng trong SQL

DECLARE 
    FUNCTION testDC RETURN NCOL PIPELINED IS 
    BEGIN 
     PIPE ROW(5); 
    END; 
BEGIN 
    FOR cur IN (select * from table (testDC())) LOOP 
     dbms_output.put_line('--> '); 
    END LOOP; 
END; 

Nhưng tôi nhận được lỗi này:

ORA-06550: line 7, column 7: pls-00231: function TESTDC may not be used in SQL
ORA-06550: line 7, column 7: PL/SQL: ORA-00904: : invalid identifier
ORA-06550: line 7, column 7: PL/SQL: SQL Statement ignored

cách tốt hơn để thử nghiệm những chức năng là gì?

+0

Bạn đang cố gắng kiểm tra điều gì? Bạn chỉ muốn gọi hàm và in mũi tên của bạn cho mỗi hàng mà nó trả về? (Đó là một lần cho chức năng đó như bạn đã hiển thị nó) –

+0

Có, tôi chỉ muốn gọi hàm và in mũi tên của bạn cho mỗi hàng nó trả về –

+2

Hàm của bạn ('testDC') được khai báo riêng trong khối ẩn danh của bạn, vì vậy bất kỳ truy vấn nào bạn chạy (bao gồm bất kỳ truy vấn nào trong khối của bạn) sẽ không thể nhìn thấy nó. Đây là một trong những trường hợp mà chúng ta thấy sự tách biệt giữa ngữ cảnh SQL và PL/SQL. –

Trả lời

6

Tạo hàm pipelined làm thủ tục độc lập hoặc thành viên gói. Sau đó, bạn có thể gọi nó từ kịch bản của bạn.

Cũng đảm bảo rằng tham số NCOL mà bạn tham chiếu được khai báo trong lược đồ có thể được truy cập bằng tập lệnh gọi.

+0

"gói thành viên" = "thêm chữ ký vào spec"? –

+0

@JeromyFrench một thành viên gói là một hàm hoặc thủ tục được xác định trong gói. Trong trường hợp này, hàm trả về một bảng ảo sẽ trả lời câu hỏi của OP. – kevinsky

2

Bạn không thể truy cập chức năng bảng trực tiếp trong PL/SQL - xem trường hợp kiểm tra bên dưới. Vì vậy, như đã chỉ ra khác, bạn phải định nghĩa hàm bảng là độc lập hoặc được đóng gói.

DECLARE 
    res NUMBER; 
    FUNCTION testDC RETURN NCOL PIPELINED IS 
    BEGIN 
     PIPE ROW(5); 
    END; 

BEGIN 
     res := testDC(); 
     dbms_output.put_line('--> '||res); 

END; 
/


ORA-06550: line 3, column 12: 
PLS-00653: aggregate/table functions are not allowed in PL/SQL scope 
Các vấn đề liên quan