U kunt SYS_REFCURSOR
. gebruiken in plaats van een standaard intern gegevenstype zoals VARCHAR2
zoals in uw geval om meerdere rijen te kunnen retourneren. Een SELECT-instructie met een INTO-clausule kan niet meerdere rijen retourneren, en het huidige foutbericht (ORA-01422
) slingert.
Maak dus een opgeslagen functie met SYS_REFCURSOR
eerst :
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;
/
en bel vervolgens vanuit de SQL Developer's console als
SQL> DECLARE
wConsumable SYS_REFCURSOR;
BEGIN
:wConsumable := GET_CONSTRAINT_COLUMNS('PRODUCTS', 'PRODUCTSPK');
END;
/
SQL> PRINT wConsumable ;
- De eerste SQL (voorbereid voor
CURSOR Extract_KEY
) is overbodig; - Er is geen verschil tussen twee
SELECT
statements binnen deLOOP
,btwLOOP
is niet nodig bij gebruik van dit huidige geval; - Het commando
PRINT
kan worden gebruikt in plaats vanDBMS_OUTPUT.PUT_LINE
om het resultaat van eenSYS_REFCURSOR
. te retourneren .