sql >> Databasteknik >  >> RDS >> Oracle

Hur kör man en lokal procedur med execute immedate?

Som Amarillo sa att du inte kan köra en lokalt definierad procedur dynamiskt, eftersom den inte finns i SQL-omfattningen som den dynamiska sektionen kommer att använda.

Situationen du beskriver är att alla procedurer är definierade i det anonyma blockets DECLARE sektionen och du kör en fråga som talar om för dig vilken av dem du ska köra - och förmodligen som också ger dig argumenten att passera. Du kan bara använda en if /else konstruktion eller ett case uttalande för att utföra lämpliga procedurer, något 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 behöver bara en WHEN villkor och lämplig proceduruppmaning för varje procedur. Du kan också antingen ha en ELSE för att fånga eventuella oväntade procedurnamn eller låta CASE_NOT_FOUND undantag (ORA-06592) kastas, beroende på vad du behöver hända om det någonsin inträffar.



  1. Inga förberedda uttalanden på serversidan med MySQL Connector/J

  2. PDO utgång utf8 infoga

  3. PDB Koppla bort ORA-17528 Fel

  4. Det gick inte att hämta projektmetadata. Se till att det är ett MSBuild-baserat .NET Core-projekt