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
SELECT
declaraciones dentro delLOOP
,por ciertoLOOP
no es necesario al usar este caso actual; - El comando
PRINT
se puede usar en lugar deDBMS_OUTPUT.PUT_LINE
para devolver el resultado de unSYS_REFCURSOR
.