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.