Anda dapat menggunakan SYS_REFCURSOR
bukan tipe data internal standar seperti VARCHAR2
seperti dalam kasus Anda agar dapat mengembalikan beberapa baris. Pernyataan SELECT dengan Klausa INTO tidak dapat mengembalikan beberapa baris, dan pesan kesalahan saat ini (ORA-01422
) lempar.
Jadi, buat fungsi tersimpan yang berisi SYS_REFCURSOR
dulu :
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;
/
lalu panggil dari konsol Pengembang SQL sebagai
SQL> DECLARE
wConsumable SYS_REFCURSOR;
BEGIN
:wConsumable := GET_CONSTRAINT_COLUMNS('PRODUCTS', 'PRODUCTSPK');
END;
/
SQL> PRINT wConsumable ;
- SQL pertama (disiapkan untuk
CURSOR Extract_KEY
) berlebihan; - Tidak ada perbedaan antara dua
SELECT
pernyataan dalamLOOP
,btwLOOP
tidak diperlukan dengan menggunakan kasus saat ini; - Perintah
PRINT
dapat digunakan sebagai penggantiDBMS_OUTPUT.PUT_LINE
untuk mengembalikan hasilSYS_REFCURSOR
.