Du kan använda SYS_REFCURSOR istället för en standard interna datatyper som VARCHAR2 som i ditt fall för att kunna returnera flera rader. En SELECT-sats med en INTO-sats kan inte returnera flera rader och det aktuella felmeddelandet (ORA-01422 ) kastar.
Skapa därför en lagrad funktion som innehåller 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;
/
och anropa sedan från SQL-utvecklarens konsol som
SQL> DECLARE
wConsumable SYS_REFCURSOR;
BEGIN
:wConsumable := GET_CONSTRAINT_COLUMNS('PRODUCTS', 'PRODUCTSPK');
END;
/
SQL> PRINT wConsumable ;
- Den första SQL-koden (förberedd för
CURSOR Extract_KEY) är redundant; - Det är ingen skillnad mellan två
SELECTsatser inomLOOP,btwLOOPbehövs inte genom att använda det här aktuella fallet; - Kommandot
PRINTkan användas istället förDBMS_OUTPUT.PUT_LINEför att returnera resultatet av enSYS_REFCURSOR.