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.