Comme Amarillo l'a dit, vous ne pouvez pas exécuter dynamiquement une procédure définie localement, car elle n'existe pas dans la portée SQL que la section dynamique utilisera.
La situation que vous décrivez est que toutes les procédures sont définies dans le DECLARE
du bloc anonyme section et vous exécutez une requête qui vous indique laquelle d'entre elles exécuter - et probablement qui vous donne également les arguments à transmettre. Vous pouvez simplement utiliser un if
/else
construction ou un case
déclaration pour exécuter les procédures appropriées, quelque chose comme :
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;
/
Vous n'avez besoin que d'un WHEN
condition et l'appel de procédure approprié pour chaque procédure. Vous pouvez également soit avoir un ELSE
pour intercepter tout nom de procédure inattendu ou laisser le CASE_NOT_FOUND
exception (ORA-06592) être levée, en fonction de ce que vous devez faire si cela se produit.