Oracle
 sql >> Base de données >  >> RDS >> Oracle

Comment puis-je créer une fonction pour renvoyer le ou les noms de colonne d'une contrainte ?

Vous pouvez utiliser SYS_REFCURSOR au lieu d'un type de données interne standard tel que VARCHAR2 comme dans votre cas afin de pouvoir retourner plusieurs lignes. Une instruction SELECT avec une clause INTO ne peut pas renvoyer plusieurs lignes et le message d'erreur actuel (ORA-01422 ) lance.

Ainsi, créez une fonction stockée contenant SYS_REFCURSOR d'abord :

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;
/

puis appelez depuis la console du développeur SQL en tant que

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

SQL> PRINT wConsumable ;
  • Le premier SQL (préparé pour CURSOR Extract_KEY ) est redondant ;
  • Il n'y a pas de différence entre deux SELECT instructions dans la LOOP , d'ailleurs LOOP n'est pas nécessaire en utilisant ce cas actuel ;
  • La commande PRINT peut être utilisé à la place de DBMS_OUTPUT.PUT_LINE afin de retourner le résultat d'un SYS_REFCURSOR .