Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Como posso fazer uma função retornar o(s) nome(s) de coluna de uma restrição?


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 do LOOP ,btw LOOP não é necessário usando este caso atual;
  • O comando PRINT pode ser usado em vez de DBMS_OUTPUT.PUT_LINE para retornar o resultado de um SYS_REFCURSOR .