Oracle
 sql >> Database >  >> RDS >> Oracle

Come posso creare una funzione per restituire i nomi di colonna di un vincolo?

Puoi usare SYS_REFCURSOR invece di tipi di dati interni standard come VARCHAR2 come nel tuo caso per poter restituire più righe. Un'istruzione SELECT con una clausola INTO non può restituire più righe e il messaggio di errore corrente(ORA-01422 ) lancia.

Quindi, crea una funzione memorizzata contenente SYS_REFCURSOR primo :

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 quindi chiama dalla console di SQL Developer come

SQL> DECLARE
    wConsumable SYS_REFCURSOR;
BEGIN
   :wConsumable := GET_CONSTRAINT_COLUMNS('PRODUCTS',  'PRODUCTSPK');
END;
/

SQL> PRINT wConsumable ;
  • Il primo SQL(preparato per CURSOR Extract_KEY ) è ridondante;
  • Non c'è differenza tra due SELECT istruzioni all'interno del LOOP ,tra LOOP non è necessario utilizzando questo caso attuale;
  • Il comando PRINT può essere utilizzato al posto di DBMS_OUTPUT.PUT_LINE per restituire il risultato di un SYS_REFCURSOR .