Целият PL/SQL блок се анализира по време на компилиране, но текстът в динамичен израз не се оценява до времето на изпълнение. (Те са почти едно и също нещо за анонимен блок, но все пак различни стъпки).
Вашият if/else също не се оценява до времето на изпълнение. Компилаторът не знае, че таблицата винаги ще съществува до момента, в който направите вмъкването, той може само да провери дали съществува или не в момента, в който анализира целия блок.
Ако таблицата вече съществува, тогава всичко е наред; компилаторът може да го види, блокът се изпълнява, вашият избор получава 1 и вие влизате в else, за да направите вмъкването. Но ако не съществува, синтактичният анализ на вмъкването е неуспешен с ORA-00942 по време на компилиране и нищо в блока не се изпълнява.
Тъй като създаването на таблицата е динамично, всички препратки към таблицата също трябва да бъдат динамични - вашето вмъкване, както сте видели, но също и ако след това го направите заявка. По принцип това прави кода ви много по-труден за четене и може да скрие синтактични грешки - тъй като динамичният код не се анализира до момента на изпълнение и е възможно да имате грешка в динамичен израз в клон, който не е уцелван за дълго време.
Глобалните временни таблици така или иначе не трябва да се създават в движение. Те са постоянни обекти с временни данни, специфични за всяка сесия и не трябва да бъдат създавани/изпускани като част от кода на вашето приложение. (По принцип не трябва да се правят промени в схемата от вашето приложение; те трябва да бъдат ограничени до промени в надстройката/поддръжката и да бъдат контролирани, за да се избегнат грешки, загуба на данни и неочаквани странични ефекти; GTT не се различават).
За разлика от временните таблици в някои други релационни бази данни, когато създавате временна таблица в база данни на Oracle, създавате дефиниция на статична таблица. Временната таблица е постоянен обект, описан в речника на данните, но изглежда празна, докато сесията ви не вмъкне данни в таблицата. Вие създавате временна таблица за самата база данни, а не за всяка съхранена процедура в PL/SQL.
Създайте GTT веднъж и направете целия си PL/SQL код статичен. Ако искате нещо по-близо до локалните временни таблици на SQL Server, разгледайте колекциите PL/SQL.