sql >> Database >  >> RDS >> Oracle

Hoe voer je een lokale procedure uit met execute immedate?

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.



  1. nodejs mssql invoegen met parameters

  2. Hoe kan ik in mijn DB in Postgresql laten zien of een luchtvaartmaatschappij vanaf alle luchthavens vertrekt?

  3. Alternatief voor ORDER BY RAND() op samengevoegde tabellen?

  4. MySQL LOAD_FILE geeft NULL terug