Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Warum wird hier EXECUTE IMMEDIATE benötigt?

Der gesamte PL/SQL-Block wird zur Kompilierzeit analysiert, aber der Text innerhalb einer dynamischen Anweisung wird erst zur Laufzeit ausgewertet. (Für einen anonymen Block sind sie fast dasselbe, aber immer noch unterschiedliche Schritte).

Ihr if/else wird auch erst zur Laufzeit ausgewertet. Der Compiler weiß nicht, dass die Tabelle immer existiert, wenn Sie Ihre Einfügung vornehmen, er kann nur prüfen, ob sie existiert oder nicht, wenn er den gesamten Block analysiert.

Wenn die Tabelle bereits existiert, ist sie in Ordnung; Der Compiler kann es sehen, der Block wird ausgeführt, Ihre Auswahl erhält 1, und Sie gehen in den Else, um die Einfügung vorzunehmen. Aber wenn es nicht existiert, dann schlägt das Parsing des Inserts korrekt mit ORA-00942 zur Kompilierzeit fehl und nichts im Block wird ausgeführt.

Da die Tabellenerstellung dynamisch ist, müssen auch alle Verweise auf die Tabelle dynamisch sein - Ihre Einfügung, wie Sie gesehen haben, aber auch, wenn Sie sie dann abfragen. Grundsätzlich macht es Ihren Code viel schwerer zu lesen und kann Syntaxfehler verbergen - da der dynamische Code erst zur Laufzeit geparst wird und es möglich ist, dass Sie einen Fehler in einer dynamischen Anweisung in einem Zweig haben, der nicht für a getroffen wird lange Zeit.

Globale temporäre Tabellen sollten sowieso nicht on-the-fly erstellt werden. Sie sind permanente Objekte mit temporären Daten, die für jede Sitzung spezifisch sind, und sollten nicht als Teil Ihres Anwendungscodes erstellt/gelöscht werden. (Im Allgemeinen sollten keine Schemaänderungen von Ihrer Anwendung vorgenommen werden; sie sollten auf Aktualisierungs-/Wartungsänderungen beschränkt sein und kontrolliert werden, um Fehler, Datenverlust und unerwartete Nebeneffekte zu vermeiden; GTTs sind nicht anders).

Im Gegensatz zu temporären Tabellen in einigen anderen relationalen Datenbanken erstellen Sie beim Erstellen einer temporären Tabelle in einer Oracle-Datenbank eine statische Tabellendefinition. Die temporäre Tabelle ist ein dauerhaftes Objekt, das im Datenwörterbuch beschrieben wird, aber leer erscheint, bis Ihre Sitzung Daten in die Tabelle einfügt. Sie erstellen eine temporäre Tabelle für die Datenbank selbst, nicht für jede gespeicherte PL/SQL-Prozedur.

Erstellen Sie die GTT einmal und machen Sie Ihren gesamten PL/SQL-Code statisch. Wenn Sie etwas Näheres zu den lokalen temporären Tabellen von SQL Server wollen, schauen Sie sich PL/SQL-Sammlungen an.