Oracle
 sql >> Base de données >  >> RDS >> Oracle

Comment exécuter une procédure locale en utilisant execute immedate ?

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.