Bạn có thể sử dụng SYS_REFCURSOR
thay vì các kiểu dữ liệu nội bộ tiêu chuẩn như VARCHAR2
như trong trường hợp của bạn để có thể trả về nhiều hàng. Câu lệnh SELECT với mệnh đề INTO không thể trả về nhiều hàng và thông báo lỗi hiện tại (ORA-01422
) ném đá.
Do đó, hãy tạo một hàm được lưu trữ có chứa SYS_REFCURSOR
đầu tiên:
SQL> CREATE OR REPLACE FUNCTION GET_CONSTRAINT_COLUMNS(iTableName IN VARCHAR2,
iConstraintName IN VARCHAR2)
RETURN SYS_REFCURSOR AS
wkeys SYS_REFCURSOR;
v_sql VARCHAR2(32767);
BEGIN
v_sql := 'SELECT column_name
FROM user_cons_columns
WHERE constraint_name = :ic
AND table_name = :it';
OPEN wkeys FOR v_sql USING iconstraintname, iTableName;
RETURN wkeys;
END;
/
và sau đó gọi từ bảng điều khiển của Nhà phát triển SQL là
SQL> DECLARE
wConsumable SYS_REFCURSOR;
BEGIN
:wConsumable := GET_CONSTRAINT_COLUMNS('PRODUCTS', 'PRODUCTSPK');
END;
/
SQL> PRINT wConsumable ;
- SQL đầu tiên (được chuẩn bị cho
CURSOR Extract_KEY
) là thừa; - Không có sự khác biệt giữa hai
SELECT
các câu lệnh trongLOOP
, btwLOOP
không cần thiết khi sử dụng trường hợp hiện tại này; - Lệnh
PRINT
có thể được sử dụng thay choDBMS_OUTPUT.PUT_LINE
inorder để trả về kết quả của mộtSYS_REFCURSOR
.