Como Amarillo disse, você não pode executar um procedimento definido localmente dinamicamente, pois ele não existe no escopo SQL que a seção dinâmica estará usando.
A situação que você descreve é que todos os procedimentos estão definidos no
DECLARE
do bloco anônimo seção e você está executando uma consulta que informa qual deles executar - e, presumivelmente, que também fornece os argumentos a serem passados. Você pode simplesmente usar um if
/else
construção ou um case
instrução para executar os procedimentos apropriados, 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;
/
Você só precisa de um
WHEN
condição e chamada de procedimento apropriado para cada procedimento. Você também pode ter um ELSE
para capturar qualquer nome de procedimento inesperado ou deixar o CASE_NOT_FOUND
exceção (ORA-06592) seja lançada, dependendo do que você precisa acontecer se isso ocorrer.