Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Wymuś upuszczenie globalnej tabeli temp. Oracle

Globalne tabele tymczasowe Oracle nie są obiektami przejściowymi. To są odpowiednie stoły sterty. Tworzymy je raz i dowolną sesję może ich używać do przechowywania danych, które są widoczne tylko dla tej sesji .

Tymczasowy aspekt polega na tym, że dane nie są trwałe poza jedną transakcją lub jedną sesją. Kluczowym szczegółem implementacji jest to, że dane są zapisywane w tymczasowym obszarze tabel, a nie stałym. Jednak dane są nadal zapisywane na dysku i odczytywane z dysku, więc korzystanie z globalnych tabel tymczasowych wiąże się ze znacznym obciążeniem.

Chodzi o to, że nie powinniśmy usuwać i odtwarzać tabel tymczasowych. Jeśli próbujesz przenieść logikę stylu SQL Server do Oracle, powinieneś rozważyć użycie kolekcji PL/SQL do przechowywania danych tymczasowych w pamięci. Dowiedz się więcej.

Konkretna przyczyna ORA-14452 jest to, że nie możemy usunąć globalnej tabeli tymczasowej, która ma trwałość zakresu sesji, jeśli zawierała dane podczas sesji. Nawet jeśli tabela jest obecnie pusta...

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>

Rozwiązaniem jest zakończenie sesji i ponowne połączenie lub (co nieco dziwne) obcięcie tabeli, a następnie jej porzucenie.

SQL> truncate table gtt23;

Table truncated.

SQL> drop table gtt23;

Table dropped.

SQL> 

Jeśli jakaś inna sesja korzysta z globalnej tabeli tymczasowej — i jest to możliwe (stąd global nomenklatury), wtedy nie będzie można usunąć tabeli, dopóki wszystkie sesje nie zostaną rozłączone.

Tak więc prawdziwym rozwiązaniem jest nauczenie się prawidłowego korzystania z globalnych tabel tymczasowych:tworzenie określonych globalnych tabel tymczasowych, aby pasowały do ​​każdego raportu. Lub, jak mówię, użyj zamiast tego kolekcji PL/SQL. Lub nawet po prostu naucz się pisać dobrze dostrojony SQL. Często używamy tabel tymczasowych jako obejścia źle napisanego zapytania, które można zapisać dzięki lepszej ścieżce dostępu.

Po zapoznaniu się z całym kodem przepływ wydaje się jeszcze dziwniejszy:

  1. Upuść i ponownie utwórz globalną tabelę tymczasową
  2. Wypełnij tabelę tymczasową
  3. Wybierz z tabeli tymczasowej do tablicy PL/SQL
  4. Wstaw do rzeczywistej tabeli za pomocą zbiorczego wstawiania z tablicy PL/SQL

Jest tu tyle kosztów ogólnych i marnowanych zajęć. Wszystko, co musisz zrobić, to pobrać dane, które wstawiasz do v2d_temp i bezpośrednio wypełnij vertical_design , najlepiej z instrukcją INSERT INTO ... SELECT * FROM. Aby przekonwertować tablicę JSON na zapytanie, będziesz potrzebować wstępnego przetwarzania, ale jest to łatwe do osiągnięcia zarówno w Javie, jak i PL/SQL.

Wydaje mi się pewne, że globalne tabele tymczasowe nie są właściwym rozwiązaniem dla twojego scenariusza.

„nasz szef lub inne osoby upierają się przy robieniu czegoś po swojemu, więc nie możesz tego zmienić”

Masz problem z szefem to nie problem z programowaniem . W związku z tym jest to nie na temat, jeśli chodzi o StackOverflow. Ale oto kilka sugestii.

Kluczową rzeczą do zapamiętania jest to, że nie mówimy o kompromisie w przypadku jakiejś nieoptymalnej architektury:to, co wyraźnie proponuje twój szef nie zadziała w środowisku wielu użytkowników. więc masz następujące opcje:

  1. Zignoruj ​​ORA-14452 błąd, przejdź do produkcji, a następnie użyj obrony „ale kazałeś mi”, gdy wszystko pójdzie nie tak. To najsłabsza gra.
  2. Potajemnie pozbądź się globalnych tabel i zaimplementuj coś, co będzie działać w scenariuszu wielu użytkowników. Jest to bardzo ryzykowne, ponieważ nie masz obrony, jeśli spartaczysz implementację.
  3. Porozmawiaj ze swoim szefem. Powiedz im, że wpadasz na ORA-14452 błąd, powiedzmy, że przeprowadziłeś pewne dochodzenie i wydaje się, że jest to fundamentalny problem z używaniem globalnych tabel tymczasowych w ten sposób, ale oczywiście coś przeoczyłeś. Następnie zapytaj ich, jak poradzili sobie z tym problemem, kiedy już go wdrożyli. Może to iść na kilka sposobów, może mają obejście, może zdadzą sobie sprawę, że jest to zły sposób używania globalnych tabel tymczasowych, może powiedzą ci, żebyś się zgubił. Tak czy inaczej, jest to najlepsze podejście:zgłosiłeś obawy na odpowiednim poziomie.

Powodzenia.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak wyłączyć wygaśnięcie hasła Oracle?

  2. Zabranie rekordu z maksymalną datą

  3. szybsze zapytanie stronicowania Oracle

  4. Inżynieria odwrotna modelu danych przy użyciu Oracle SQL Developer

  5. Co oznacza %Type w Oracle sql?