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
SELECT
istruzioni all'interno delLOOP
,traLOOP
non è necessario utilizzando questo caso attuale; - Il comando
PRINT
può essere utilizzato al posto diDBMS_OUTPUT.PUT_LINE
per restituire il risultato di unSYS_REFCURSOR
.