sql >> Base de Datos >  >> RDS >> Oracle

¿Cómo ejecutar un procedimiento local usando la ejecución inmediata?

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.