Zoals Amarillo zei, kun je een lokaal gedefinieerde procedure niet dynamisch uitvoeren, omdat deze niet bestaat in het SQL-bereik dat de dynamische sectie zal gebruiken.
De situatie die u beschrijft is dat alle procedures zijn gedefinieerd in de DECLARE
. van het anonieme blok sectie en u voert een query uit die u vertelt welke van hen u moet uitvoeren - en vermoedelijk geeft u ook de argumenten om door te geven. Je kunt gewoon een if
. gebruiken /else
constructie of een case
statement om de juiste procedures uit te voeren, zoiets als:
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;
/
Je hebt er maar één nodig WHEN
toestand en de juiste procedure-oproep voor elke procedure. U kunt ook een ELSE
. hebben om onverwachte procedurenamen op te vangen of laat de CASE_NOT_FOUND
uitzondering (ORA-06592) worden gegenereerd, afhankelijk van wat er moet gebeuren als dat ooit gebeurt.