Du kan bruge SYS_REFCURSOR
i stedet for en standard intern datatype såsom VARCHAR2
som i dit tilfælde for at kunne returnere flere rækker. En SELECT-sætning med en INTO-klausul kan ikke returnere flere rækker og den aktuelle fejlmeddelelse (ORA-01422
) kaster.
Opret derfor en gemt funktion indeholdende SYS_REFCURSOR
først :
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;
/
og ring derefter fra SQL-udviklerkonsollen som
SQL> DECLARE
wConsumable SYS_REFCURSOR;
BEGIN
:wConsumable := GET_CONSTRAINT_COLUMNS('PRODUCTS', 'PRODUCTSPK');
END;
/
SQL> PRINT wConsumable ;
- Den første SQL(forberedt til
CURSOR Extract_KEY
) er overflødig; - Der er ingen forskel mellem to
SELECT
sætninger iLOOP
,btwLOOP
er ikke nødvendig ved at bruge denne aktuelle sag; - Kommandoen
PRINT
kan bruges i stedet forDBMS_OUTPUT.PUT_LINE
for at returnere resultatet af enSYS_REFCURSOR
.