Както каза Амарило, не можете да изпълните локално дефинирана процедура динамично, тъй като тя не съществува в обхвата на SQL, който ще използва динамичната секция.
Ситуацията, която описвате, е, че всички процедури са дефинирани в DECLARE
на анонимния блок раздел и изпълнявате заявка, която ви казва кой от тях да изпълните - и вероятно също така ви дава аргументите за предаване. Можете просто да използвате if
/else
конструкция или case
израз за изпълнение на подходящите процедури, нещо като:
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;
/
Трябва ви само едно WHEN
състояние и обаждане за подходяща процедура за всяка процедура. Можете също да имате ELSE
за улавяне на неочаквани имена на процедури или оставяне на CASE_NOT_FOUND
изключение (ORA-06592) бъде хвърлено в зависимост от това какво трябва да се случи, ако това някога се случи.