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

Dlaczego potrzebne jest tutaj WYKONANIE NATYCHMIASTOWE?

Cały blok PL/SQL jest analizowany w czasie kompilacji, ale tekst w instrukcji dynamicznej jest oceniany dopiero w czasie wykonywania. (W przypadku anonimowego bloku są one podobne do tego samego, ale nadal różnią się od siebie).

Twoje if/else również nie jest oceniane do czasu uruchomienia. Kompilator nie wie, że tabela będzie zawsze istniała do czasu wstawienia, może tylko sprawdzić, czy istnieje w momencie, w którym analizuje cały blok.

Jeśli tabela już istnieje, to jest OK; kompilator może to zobaczyć, blok wykonuje się, twój wybór otrzymuje 1, a ty przechodzisz do innego, aby wykonać wstawienie. Ale jeśli nie istnieje, to parsowanie wstawki nie powiedzie się poprawnie z ORA-00942 w czasie kompilacji i nic w bloku nie jest wykonywane.

Ponieważ tworzenie tabeli jest dynamiczne, wszystkie odniesienia do tabeli również muszą być dynamiczne — wstawka, jak widzieliście, ale także wtedy, gdy wyślecie zapytanie. Zasadniczo sprawia to, że kod jest znacznie trudniejszy do odczytania i może ukryć błędy składniowe — ponieważ kod dynamiczny nie jest analizowany do czasu wykonania i możliwe jest, że w instrukcji dynamicznej w gałęzi, która nie jest trafiona, wystąpił błąd w instrukcji dynamicznej. długi czas.

Globalne tabele tymczasowe i tak nie powinny być tworzone w locie. Są to trwałe obiekty z danymi tymczasowymi, specyficzne dla każdej sesji i nie powinny być tworzone/usuwane jako część kodu aplikacji. (Ogólnie rzecz biorąc, Twoja aplikacja nie powinna wprowadzać żadnych zmian w schemacie; powinny one ograniczać się do zmian aktualizacji/konserwacji i być kontrolowane, aby uniknąć błędów, utraty danych i nieoczekiwanych skutków ubocznych; GTT nie różnią się od siebie).

W przeciwieństwie do tabel tymczasowych w niektórych innych relacyjnych bazach danych, podczas tworzenia tabeli tymczasowej w bazie danych Oracle tworzy się definicję tabeli statycznej. Tabela tymczasowa jest trwałym obiektem opisanym w słowniku danych, ale jest wyświetlana jako pusta, dopóki sesja nie wstawi danych do tabeli. Tworzysz tymczasową tabelę dla samej bazy danych, a nie dla każdej procedury składowanej PL/SQL.

Utwórz GTT raz i spraw, aby cały kod PL/SQL stał się statyczny. Jeśli chcesz coś bliżej lokalnych tabel tymczasowych SQL Server, zajrzyj do kolekcji PL/SQL.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. NEXT_DAY() Funkcja w Oracle

  2. Jak przechowywać identyfikator GUID w Oracle?

  3. Jak przyznać dostęp do widoków v$ (v$sesja ,v$instance)

  4. 12c Plany adaptacyjne

  5. Konwersja stref czasowych w zapytaniu SQL