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
SELECT
instruções dentro doLOOP
,btwLOOP
não é necessário usando este caso atual; - O comando
PRINT
pode ser usado em vez deDBMS_OUTPUT.PUT_LINE
para retornar o resultado de umSYS_REFCURSOR
.