sql >> Databáze >  >> RDS >> Oracle

Proč je zde potřeba EXECUTE IMMEDIATE?

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.



  1. SQL Server CTE a příklad rekurze

  2. Postgresql nevytváří db s „createdb“ jako superuživatel, přesto nevypisuje chyby

  3. Rozdíl mezi CTE a SubQuery?

  4. Jak naformátuji své dotazy Oracle tak, aby se sloupce nezalamovaly?