Możesz użyć SYS_REFCURSOR zamiast standardowych wewnętrznych typów danych, takich jak VARCHAR2 tak jak w twoim przypadku, aby móc zwrócić wiele wierszy. Instrukcja SELECT z klauzulą INTO nie może zwrócić wielu wierszy i bieżącego komunikatu o błędzie (ORA-01422 ) miota.
Dlatego utwórz przechowywaną funkcję zawierającą SYS_REFCURSOR po pierwsze :
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;
/
a następnie wywołaj z konsoli SQL Developer jako
SQL> DECLARE
wConsumable SYS_REFCURSOR;
BEGIN
:wConsumable := GET_CONSTRAINT_COLUMNS('PRODUCTS', 'PRODUCTSPK');
END;
/
SQL> PRINT wConsumable ;
- Pierwszy SQL (przygotowany dla
CURSOR Extract_KEY) jest zbędne; - Nie ma różnicy między dwoma
SELECTinstrukcje wLOOP,btwLOOPnie jest potrzebne przy użyciu tego aktualnego przypadku; - Polecenie
PRINTmoże być użyty zamiastDBMS_OUTPUT.PUT_LINEaby zwrócić wynikSYS_REFCURSOR.