Você pode usar
SYS_REFCURSOR em vez de tipos de dados internos padrão, como VARCHAR2 como no seu caso para poder retornar várias linhas. Uma instrução SELECT com uma cláusula INTO não pode retornar várias linhas e a mensagem de erro atual (ORA-01422 ) arremessa. Assim, crie uma função armazenada contendo
SYS_REFCURSOR primeiro :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, em seguida, chame do console do SQL Developer como
SQL> DECLARE
wConsumable SYS_REFCURSOR;
BEGIN
:wConsumable := GET_CONSTRAINT_COLUMNS('PRODUCTS', 'PRODUCTSPK');
END;
/
SQL> PRINT wConsumable ;
- O primeiro SQL(preparado para
CURSOR Extract_KEY) é redundante; - Não há diferença entre dois
SELECTinstruções dentro doLOOP,btwLOOPnão é necessário usando este caso atual; - O comando
PRINTpode ser usado em vez deDBMS_OUTPUT.PUT_LINEpara retornar o resultado de umSYS_REFCURSOR.