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

Vynutit Oracle Drop Global Temp Table

Globální dočasné tabulky Oracle nejsou přechodné objekty. Jsou to správné haldové tabulky. Vytváříme je jednou a každou relaci může je použít k ukládání dat, která jsou viditelná pouze pro tuto relaci .

Dočasným aspektem je, že data nejsou trvalá po dobu jedné transakce nebo jedné relace. Klíčovým detailem implementace je, že data se zapisují do dočasného tabulkového prostoru, nikoli do trvalého. Data se však stále zapisují na disk a čtou z disku, takže používání globálních dočasných tabulek představuje značné zatížení.

Jde o to, že bychom neměli zahazovat a znovu vytvářet dočasné tabulky. Pokud se pokoušíte přenést logiku stylu SQL Server do Oracle, měli byste zvážit použití kolekcí PL/SQL k udržení dočasných dat v paměti. Zjistit více.

Konkrétní příčina ORA-14452 spočívá v tom, že nemůžeme zrušit globální dočasnou tabulku, která má trvalý rozsah relace, pokud během relace obsahovala data. I když je tabulka aktuálně prázdná...

SQL> create global temporary table gtt23 (col1 number)
  2  on commit preserve rows
  3  /

Table created.

SQL> insert into gtt23 values (1);

1 row created.

SQL> commit;

Commit complete.

SQL> delete from gtt23;

1 row deleted.

SQL> commit;

Commit complete.

SQL> drop table gtt23;
drop table gtt23
           *
ERROR at line 1:
ORA-14452: attempt to create, alter or drop an index on temporary table already in use

SQL>

Řešením je ukončit relaci a znovu se připojit, nebo (poněkud bizarně) zkrátit tabulku a poté ji zahodit.

SQL> truncate table gtt23;

Table truncated.

SQL> drop table gtt23;

Table dropped.

SQL> 

Pokud nějaká jiná relace používá globální dočasnou tabulku - a to je možné (proto global nomenklatura), pak nebudete moci tabulku zrušit, dokud se všechny relace neodpojí.

Skutečným řešením je tedy naučit se správně používat globální dočasné tabulky:vytvořit specifické globální dočasné tabulky, které budou odpovídat každé sestavě. Nebo, jak říkám, použijte místo toho kolekce PL/SQL. Nebo se dokonce jen naučte psát dobře vyladěné SQL. Často používáme dočasné tabulky jako řešení špatně napsaných dotazů, které lze uložit pomocí lepší přístupové cesty.

Když se podíváte na váš úplný kód, tok se zdá být ještě bizarnější:

  1. Zrušte a znovu vytvořte globální dočasnou tabulku
  2. Vyplnit dočasnou tabulku
  3. Vyberte z dočasné tabulky do pole PL/SQL
  4. Vložit do skutečné tabulky pomocí hromadného vložení z pole PL/SQL

Je tu tolik režie a zbytečné činnosti. Vše, co musíte udělat, je vzít data, která vložíte do v2d_temp a přímo vyplňte vertical_design , ideálně s příkazem INSERT INTO ... SELECT * FROM. K převodu pole JSON na dotaz budete potřebovat určité předběžné zpracování, ale toho lze snadno dosáhnout v Javě nebo PL/SQL.

Zdá se mi jisté, že globální dočasné tabulky nejsou pro váš scénář tím správným řešením.

"Náš šéf nebo jiné osoby trvají na tom, že něco dělají svým způsobem, takže to nemůžete změnit."

To, co máte, je Problém s šéfem nejde o Problém s programováním . V důsledku toho je to mimo téma, pokud jde o StackOverflow. Ale přesto je zde několik návrhů.

Klíčová věc, kterou je třeba si zapamatovat, je, že nehovoříme o kompromisu na nějaké suboptimální architektuře:to, co navrhne váš šéf, jasně nebude fungovat ve víceuživatelském prostředí. takže vaše možnosti jsou:

  1. Ignorujte ORA-14452 chyba, pokračujte do výroby a poté použijte obranu "ale vy jste mi řekl, že", když se to všechno strašně pokazí. Toto je nejslabší hra.
  2. Skrytě zahazujte globální tabulky a implementujte něco, co bude fungovat ve scénáři pro více uživatelů. To je vysoce rizikové, protože nemáte žádnou obranu, pokud implementaci zpackáte.
  3. Promluvte si se svým šéfem. Řekněte jim, že narážíte na ORA-14452 chyba, řekněme, že jste provedli nějaké vyšetřování a zdá se, že jde o zásadní problém s používáním globálních dočasných tabulek tímto způsobem, ale zjevně jste něco přehlédli. Poté se jich zeptejte, jak se jim tento problém podařilo obejít, když jej již implementovali dříve. Může to jít několika způsoby, možná mají řešení, možná si uvědomí, že toto je špatný způsob použití globálních dočasných tabulek, možná vám řeknou, abyste se ztratili. Ať tak či onak, toto je nejlepší přístup:vznesli jste obavy na příslušnou úroveň.

Hodně štěstí.



  1. Generování dat a kvalita hardwaru

  2. Existuje způsob, jak vytvořit více spouštěčů v jednom skriptu?

  3. Jak používat SUBSTRING() v MySQL

  4. Export MySQL do výstupního souboru:CSV escaping chars