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

Hvorfor er der behov for UDFØR STRAKS her?

Hele PL/SQL-blokken parses på kompileringstidspunktet, men teksten i en dynamisk sætning evalueres ikke før runtime. (De er tæt på det samme for en anonym blokering, men stadig adskilte trin).

Dit if/else bliver heller ikke evalueret før runtime. Compileren ved ikke, at tabellen altid vil eksistere, når du laver din indsættelse, den kan kun kontrollere, om den eksisterer eller ej på det tidspunkt, hvor den analyserer hele blokken.

Hvis tabellen allerede eksisterer, er den OK; compileren kan se det, blokken udføres, din select får 1, og du går ind i else for at lave indsættelsen. Men hvis det ikke eksisterer, fejler parsingen af ​​indsættelsen korrekt med ORA-00942 på kompileringstidspunktet og intet i blokken udføres.

Da tabeloprettelsen er dynamisk, skal alle referencer til tabellen også være dynamiske - din indsætning som du har set, men også hvis du så forespørger på den. Dybest set gør det din kode meget sværere at læse og kan skjule syntaksfejl - da den dynamiske kode ikke parses før køretid, og det er muligt, at du kan have en fejl i en dynamisk sætning i en gren, der ikke er ramt for en lang tid.

Globale midlertidige tabeller bør alligevel ikke oprettes på farten. De er permanente objekter med midlertidige data, specifikke for hver session, og bør ikke oprettes/slettes som en del af din applikationskode. (Ingen skemaændringer bør generelt foretages af din applikation; de bør være begrænset til opgraderings-/vedligeholdelsesændringer og kontrolleres for at undgå fejl, datatab og uventede bivirkninger; GTT'er er ikke anderledes).

I modsætning til midlertidige tabeller i nogle andre relationelle databaser, når du opretter en midlertidig tabel i en Oracle-database, opretter du en statisk tabeldefinition. Den midlertidige tabel er et vedvarende objekt beskrevet i dataordbogen, men vises tom, indtil din session indsætter data i tabellen. Du opretter en midlertidig tabel for selve databasen, ikke for hver PL/SQL-lagrede procedure.

Opret GTT én gang, og gør al din PL/SQL-kode statisk. Hvis du vil have noget tættere på SQL Servers lokale midlertidige tabeller, så se nærmere på PL/SQL-samlinger.



  1. Oracle-skemabruger kan ikke oprette tabel i procedure

  2. Returner det aktuelle loginnavn i SQL Server (T-SQL)

  3. Sådan forbinder du MySQL-database med PHP-websted

  4. How to_char() virker i PostgreSQL