Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Wie kann ich eine Funktion erstellen, um die Spaltennamen einer Einschränkung zurückzugeben?

Sie können SYS_REFCURSOR verwenden anstelle eines standardmäßigen internen Datentyps wie VARCHAR2 wie in Ihrem Fall, um mehrere Zeilen zurückgeben zu können. Eine SELECT-Anweisung mit einer INTO-Klausel kann nicht mehrere Zeilen zurückgeben, und die aktuelle Fehlermeldung (ORA-01422 ) schleudert.

Erstellen Sie daher eine gespeicherte Funktion, die SYS_REFCURSOR enthält zuerst :

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

und rufen Sie dann von der Konsole des SQL-Entwicklers als

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

SQL> PRINT wConsumable ;
  • Das erste SQL(vorbereitet für CURSOR Extract_KEY ) ist überflüssig;
  • Es gibt keinen Unterschied zwischen zwei SELECT Anweisungen innerhalb der LOOP ,übrigens LOOP wird in diesem Fall nicht benötigt;
  • Der Befehl PRINT kann anstelle von DBMS_OUTPUT.PUT_LINE verwendet werden um das Ergebnis eines SYS_REFCURSOR zurückzugeben .