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.