Jak powiedział Amarillo, nie można dynamicznie wykonać procedury zdefiniowanej lokalnie, ponieważ nie istnieje ona w zakresie SQL, którego będzie używać sekcja dynamiczna.
Opisana sytuacja polega na tym, że wszystkie procedury są zdefiniowane w DECLARE bloku anonimowego sekcji i uruchamiasz zapytanie, które mówi ci, które z nich wykonać - i przypuszczalnie również podaje argumenty do przekazania. Możesz po prostu użyć if /else konstrukcja lub case instrukcja, aby wykonać odpowiednie procedury, na przykład:
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;
/
Potrzebujesz tylko jednego WHEN warunek i odpowiednia procedura wzywają do każdej procedury. Możesz także mieć ELSE aby wyłapać nieoczekiwane nazwy procedur lub pozwolić CASE_NOT_FOUND wyjątek (ORA-06592), w zależności od tego, co ma się wydarzyć, jeśli tak się stanie.