Como dijo Amarillo, no puede ejecutar dinámicamente un procedimiento definido localmente, ya que no existe en el ámbito de SQL que utilizará la sección dinámica.
La situación que describe es que todos los procedimientos están definidos en el bloque anónimo DECLARE
sección y está ejecutando una consulta que le dice cuál de ellos ejecutar, y presumiblemente cuál también le da los argumentos para pasar. Puedes simplemente usar un if
/else
construcción o un case
declaración para ejecutar los procedimientos apropiados, algo como:
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;
/
Solo necesitas un WHEN
Condición y convocatoria de procedimiento correspondiente a cada procedimiento. También puede tener un ELSE
para detectar cualquier nombre de procedimiento inesperado o dejar que CASE_NOT_FOUND
se lanzará una excepción (ORA-06592), dependiendo de lo que necesite que suceda si eso ocurre alguna vez.