sql >> Base de Datos >  >> RDS >> Oracle

¿Cómo puedo hacer una función para devolver los nombres de columna de una restricción?

Puedes usar SYS_REFCURSOR en lugar de tipos de datos internos estándar como VARCHAR2 como en su caso para poder devolver varias filas. Una instrucción SELECT con una cláusula INTO no puede devolver varias filas y el mensaje de error actual (ORA-01422 ) lanza.

Por lo tanto, cree una función almacenada que contenga SYS_REFCURSOR primero :

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

y luego llame desde la consola de SQL Developer como

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

SQL> PRINT wConsumable ;
  • El primer SQL (preparado para CURSOR Extract_KEY ) es redundante;
  • No hay diferencia entre dos SELECT declaraciones dentro del LOOP ,por cierto LOOP no es necesario al usar este caso actual;
  • El comando PRINT se puede usar en lugar de DBMS_OUTPUT.PUT_LINE para devolver el resultado de un SYS_REFCURSOR .