Het hele PL/SQL-blok wordt tijdens het compileren geparseerd, maar de tekst in een dynamische instructie wordt pas tijdens runtime geëvalueerd. (Ze zijn bijna hetzelfde voor een anonieme blokkering, maar nog steeds verschillende stappen).
Uw if/else wordt ook niet geëvalueerd tot runtime. De compiler weet niet dat de tabel altijd zal bestaan op het moment dat u uw invoegtoepassing uitvoert, hij kan alleen controleren of deze al dan niet bestaat op het moment dat hij het hele blok ontleedt.
Als de tabel al bestaat, is het OK; de compiler kan het zien, het blok wordt uitgevoerd, uw select krijgt 1, en u gaat naar de else om de invoeging uit te voeren. Maar als het niet bestaat, mislukt het parseren van de insert correct met ORA-00942 tijdens het compileren en niets in het blok wordt uitgevoerd.
Aangezien het maken van een tabel dynamisch is, moeten alle verwijzingen naar de tabel ook dynamisch zijn - uw invoeging zoals u hebt gezien, maar ook als u er vervolgens een query op uitvoert. In feite maakt het uw code veel moeilijker te lezen en kan het syntaxisfouten verbergen - aangezien de dynamische code pas tijdens runtime wordt geparseerd, en het is mogelijk dat u een fout maakt in een dynamische instructie in een branch die niet wordt geraakt voor een lange tijd.
Globale tijdelijke tabellen mogen sowieso niet on-the-fly worden gemaakt. Het zijn permanente objecten met tijdelijke gegevens, specifiek voor elke sessie, en mogen niet worden gemaakt/verwijderd als onderdeel van uw toepassingscode. (Er mogen geen schemawijzigingen worden aangebracht door uw toepassing in het algemeen; ze moeten beperkt blijven tot upgrade-/onderhoudswijzigingen en moeten worden gecontroleerd om fouten, gegevensverlies en onverwachte bijwerkingen te voorkomen; GTT's is niet anders).
In tegenstelling tot tijdelijke tabellen in sommige andere relationele databases, maakt u bij het maken van een tijdelijke tabel in een Oracle-database een statische tabeldefinitie. De tijdelijke tabel is een permanent object dat wordt beschreven in de datadictionary, maar lijkt leeg totdat uw sessie gegevens in de tabel invoegt. U maakt een tijdelijke tabel voor de database zelf, niet voor elke opgeslagen PL/SQL-procedure.
Maak de GTT één keer aan en maak al uw PL/SQL-code statisch. Als je iets dichter bij de lokale tijdelijke tabellen van SQL Server wilt, kijk dan eens naar PL/SQL-verzamelingen.