Puoi usare SYS_REFCURSOR invece di tipi di dati interni standard come VARCHAR2 come nel tuo caso per poter restituire più righe. Un'istruzione SELECT con una clausola INTO non può restituire più righe e il messaggio di errore corrente(ORA-01422 ) lancia.
Quindi, crea una funzione memorizzata contenente SYS_REFCURSOR primo :
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;
/
e quindi chiama dalla console di SQL Developer come
SQL> DECLARE
wConsumable SYS_REFCURSOR;
BEGIN
:wConsumable := GET_CONSTRAINT_COLUMNS('PRODUCTS', 'PRODUCTSPK');
END;
/
SQL> PRINT wConsumable ;
- Il primo SQL(preparato per
CURSOR Extract_KEY) è ridondante; - Non c'è differenza tra due
SELECTistruzioni all'interno delLOOP,traLOOPnon è necessario utilizzando questo caso attuale; - Il comando
PRINTpuò essere utilizzato al posto diDBMS_OUTPUT.PUT_LINEper restituire il risultato di unSYS_REFCURSOR.