Som Amarillo sagde, kan du ikke udføre en lokalt defineret procedure dynamisk, da den ikke eksisterer i SQL-omfanget, som den dynamiske sektion vil bruge.
Den situation du beskriver er, at alle procedurerne er defineret i den anonyme bloks DECLARE
sektion, og du kører en forespørgsel, der fortæller dig, hvilken af dem du skal udføre - og formodentlig som også giver dig argumenterne til at bestå. Du kan bare bruge en if
/else
konstruktion eller en case
sætning for at udføre de relevante procedurer, noget som:
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;
/
Du skal bare bruge en WHEN
tilstand og passende procedure kræver for hver procedure. Du kan også enten have en ELSE
for at fange eventuelle uventede procedurenavne eller lade CASE_NOT_FOUND
undtagelse (ORA-06592), afhængigt af hvad du skal ske, hvis det nogensinde sker.