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.