Puedes usar SYS_REFCURSOR en lugar de tipos de datos internos estándar como VARCHAR2 como en su caso para poder devolver varias filas. Una instrucción SELECT con una cláusula INTO no puede devolver varias filas y el mensaje de error actual (ORA-01422 ) lanza.
Por lo tanto, cree una función almacenada que contenga SYS_REFCURSOR primero :
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;
/
y luego llame desde la consola de SQL Developer como
SQL> DECLARE
wConsumable SYS_REFCURSOR;
BEGIN
:wConsumable := GET_CONSTRAINT_COLUMNS('PRODUCTS', 'PRODUCTSPK');
END;
/
SQL> PRINT wConsumable ;
- El primer SQL (preparado para
CURSOR Extract_KEY) es redundante; - No hay diferencia entre dos
SELECTdeclaraciones dentro delLOOP,por ciertoLOOPno es necesario al usar este caso actual; - El comando
PRINTse puede usar en lugar deDBMS_OUTPUT.PUT_LINEpara devolver el resultado de unSYS_REFCURSOR.