Celý blok PL/SQL je analyzován při kompilaci, ale text v dynamickém příkazu není vyhodnocen až za běhu. (U anonymního bloku se blíží stejné věci, ale stále jsou odlišné).
Vaše if/else není vyhodnoceno ani za běhu. Kompilátor neví, že tabulka bude vždy existovat v době, kdy provedete vložení, může pouze zkontrolovat, zda existuje nebo ne v okamžiku, kdy analyzuje celý blok.
Pokud tabulka již existuje, je to v pořádku; kompilátor to vidí, blok se provede, váš select dostane 1 a vy přejdete do jiného, abyste provedli vložení. Pokud však neexistuje, pak analýza vložení správně selže s ORA-00942 v době kompilace a nic v bloku se neprovede.
Vzhledem k tomu, že vytváření tabulky je dynamické, všechny odkazy na tabulku musí být také dynamické – vaše vložení, jak jste viděli, ale také pokud se na ni poté dotazujete. V zásadě to dělá váš kód mnohem hůře čitelným a může skrýt syntaktické chyby – protože dynamický kód není analyzován až za běhu a je možné, že můžete mít chybu v dynamickém příkazu ve větvi, která není zasažena dlouho.
Globální dočasné tabulky by stejně neměly být vytvářeny za běhu. Jsou to trvalé objekty s dočasnými daty, které jsou specifické pro každou relaci a neměly by být vytvořeny/vypuštěny jako součást kódu vaší aplikace. (Vaše aplikace by obecně neměla provádět žádné změny schématu; měly by být omezeny na změny upgradu/údržby a měly by být kontrolovány, aby se předešlo chybám, ztrátě dat a neočekávaným vedlejším účinkům; GTT se neliší.
Na rozdíl od dočasných tabulek v některých jiných relačních databázích, když vytvoříte dočasnou tabulku v databázi Oracle, vytvoříte definici statické tabulky. Dočasná tabulka je trvalý objekt popsaný v datovém slovníku, ale jeví se prázdný, dokud relace nevloží data do tabulky. Vytvoříte dočasnou tabulku pro samotnou databázi, nikoli pro každou uloženou proceduru PL/SQL.
Vytvořte GTT jednou a udělejte veškerý svůj PL/SQL kód statický. Pokud chcete něco blíže k místním dočasným tabulkám SQL Serveru, podívejte se do kolekcí PL/SQL.