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

Wie führe ich eine lokale Prozedur mit Execute Immedate aus?

Wie Amarillo sagte, können Sie eine lokal definierte Prozedur nicht dynamisch ausführen, da sie nicht im SQL-Bereich existiert, den der dynamische Abschnitt verwenden wird.

Die von Ihnen beschriebene Situation ist, dass alle Prozeduren im DECLARE des anonymen Blocks definiert sind Abschnitt und Sie führen eine Abfrage aus, die Ihnen mitteilt, welche davon ausgeführt werden sollen - und die Ihnen vermutlich auch die zu übergebenden Argumente liefert. Sie können einfach ein if verwenden /else Konstrukt oder ein case -Anweisung, um die entsprechenden Prozeduren auszuführen, etwa so:

DECLARE
  ...
BEGIN
  FOR data IN (SELECT procname, arg1, arg2, ... from <your_query>) LOOP
    CASE data.procname
      WHEN 'OPENLOG' THEN
        openlog(data.arg1);
      WHEN 'WRITELOG' THEN
        writelog(data.arg1, data.arg2);
      WHEN ...
        ...
      ELSE
         -- handle/report an invalid procedure name
         -- or skip the `ELSE` and let CASE_NOT_FOUND be thrown
    END CASE;
  END LOOP;
END;
/

Sie brauchen nur ein WHEN Bedingung und geeigneter Prozeduraufruf für jede Prozedur. Sie können auch entweder ein ELSE haben um unerwartete Prozedurnamen abzufangen oder den CASE_NOT_FOUND zu lassen Ausnahme (ORA-06592) ausgelöst werden, je nachdem, was passieren soll, falls das jemals passiert.