sql >> Database teknologi >  >> RDS >> Oracle

Hvordan udfører man en lokal procedure ved hjælp af execute immedate?

Som Amarillo sagde, kan du ikke udføre en lokalt defineret procedure dynamisk, da den ikke eksisterer i SQL-omfanget, som den dynamiske sektion vil bruge.

Den situation du beskriver er, at alle procedurerne er defineret i den anonyme bloks DECLARE sektion, og du kører en forespørgsel, der fortæller dig, hvilken af ​​dem du skal udføre - og formodentlig som også giver dig argumenterne til at bestå. Du kan bare bruge en if /else konstruktion eller en case sætning for at udføre de relevante procedurer, noget som:

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;
/

Du skal bare bruge en WHEN tilstand og passende procedure kræver for hver procedure. Du kan også enten have en ELSE for at fange eventuelle uventede procedurenavne eller lade CASE_NOT_FOUND undtagelse (ORA-06592), afhængigt af hvad du skal ske, hvis det nogensinde sker.



  1. Hvad er den bedste praksis for migrering af en Oracle 10g-database til Microsoft SQL 2008 R2? Applikationen bruger Hibernate

  2. Brug af Solr søgeindeks som database - er det forkert?

  3. Databasesikkerhed 101:Sikkerhed i Open Source-databaser

  4. Self-Referencing ManyToMany Relationship TypeORM