2013-03-05 11 views
6

W bloku Oracle PL/SQL, dlaczego jest dynamiczny sql dozwoloneDlaczego statyczny ddl nie jest dozwolony w PL/SQL?

begin 
    execute immediate 'drop table table_name'; 
end; 

ale nie jest statyczny?

begin 
    drop table table_name; 
end; 

Mam nadzieję, że odpowiedź jest bardziej wnikliwa niż "ponieważ tak działa ten język".

+1

Bez odniesienia do myślenia zespołu projektującego PL/SQL, nie sądzę, możemy ** wiedzieć ** dlaczego PL/SQL nie pozwala na statyczne DDL. Możemy tylko omówić plusy i minusy podejścia i nie będzie odpowiedzi, która jest ** odpowiedzią. –

+2

Myślę, że odpowiedzi udzielone do tej pory dowodzą, że to pytanie jest odpowiedzialne, poparte faktami - i prawdopodobnie również konstruktywne. –

+1

Jeffrey Kemp ma rację, zatwierdzona odpowiedź pokazuje, że to pytanie nie powinno zostać zamknięte - tak jak wielu innych na stronie, niestety. –

Odpowiedz

9

Odpowiedź jest PL/SQL nie obsługuje polimorfizm dynamiczny. wspiera tylko statyczny polimorfizm, ponieważ wszystkie PL/SQL generują "DIANA" -> opisowy pośredni przypisany atrybut dla Ada, pośredniego języka o strukturze drzewiastej. DIANA jest używana wewnętrznie przez kompilatory.

W czasie kompilacji kod źródłowy PL/SQL jest tłumaczony na kod systemowy i generowany jest odpowiedni DIANA. Teraz pomyśl, czy istnieje instrukcja DDL, taka jak tworzenie instrukcji tabeli, która w czasie kompilacji nie istnieje, zostanie utworzona po uruchomieniu programu. W jaki sposób twój silnik PL/SQL wygeneruje DIANę?

DIANA odgrywa ważną rolę w PL/SQL, aby sprawdzić/sprawdzić poprawność programu podrzędnego. jest to wymagane, ponieważ wiemy, że podprogram może wykorzystywać obiekty bazy danych, takie jak tabele, widoki, synonimy lub inne przechowywane procesy. może być możliwe, że obiekty mogły się zmienić/usunąć/upuścić, gdy następnym razem uruchomisz program. Na przykład: ktoś mógł upuścić tabelę, przechowywany proc lub funkcja mogła ulec zmianie.

To dlatego ogólnie PL/SQL jest używane do manipulowania danymi w strukturze bazy danych, ale nie do manipulowania tymi strukturami.

ale istnieją sposoby manipulowania przy użyciu dynamicznego pakietu SQL i DBMS_SQL, ale te metody methodlogy są ponownie powinny być używane ostrożnie. Na przykład, jeśli tworzysz tabelę, powinieneś najpierw sprawdzić, czy ta tabela już istnieje, czy nie używa widoków słownika danych.

+0

'Instrukcja _DDL taka jak tworzenie instrukcji tabeli, która w czasie kompilacji nie istnieje_'. ale dlaczego instrukcje DDL nie są częścią czasu kompilacji? –

3

Prawdopodobnie dlatego, że w przeciwnym razie niektóre kodu byłoby jak:

begin 
    create table tmp (n number); 
    insert into tmp values (1); 
    end; 

I spodziewamy kompilator do wiedzieć że w momencie wkładki, tabela istnieje. Kompilacja bloku byłaby znacznie trudniejsza. Tutaj jest to bardzo prosty przypadek, ale możemy łatwo wyobrazić sobie pewne warunkowe rozgałęzienia i złożoną blabla.

Ale ponieważ musimy ustawić DDL w bloku natychmiastowego wykonania, ograniczenie może być jakoś łatwiejsze do zrozumienia.

tylko pomysł ...

Powiązane problemy