Oracle
 sql >> Database >  >> RDS >> Oracle

Come eseguire una procedura locale utilizzando esegui immedate?

Come ha detto Amarillo, non è possibile eseguire dinamicamente una procedura definita localmente, poiché non esiste nell'ambito SQL verrà utilizzata dalla sezione dinamica.

La situazione che descrivi è che tutte le procedure sono definite nel DECLARE del blocco anonimo e stai eseguendo una query che ti dice quale di loro eseguire - e presumibilmente che ti dà anche gli argomenti da passare. Puoi semplicemente usare un if /else costrutto o un case istruzione per eseguire le procedure appropriate, qualcosa come:

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;
/

Hai solo bisogno di un WHEN condizione e procedura appropriata richiedono per ciascuna procedura. Puoi anche avere un ELSE per rilevare eventuali nomi di procedure imprevisti o lasciare che CASE_NOT_FOUND viene generata un'eccezione (ORA-06592), a seconda di ciò che è necessario che accada se ciò si verifica.