Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Como executar um procedimento local usando execute immedate?


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.