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.