Jak odróżnić SQL od PL / SQL?

16

Wiem, że pytanie może brzmieć zbyt głupio, ale nigdy nie zrozumiałem tej części.

SQL * Plus działa zarówno z SQL, jak i PL / SQL. Skąd mam wiedzieć, czy jakiś kod to SQL, czy PL / SQL? Jeśli mój kod ma pętlę for, to czy nie jest to już SQL?

PL / SQL jest rozszerzeniem dla SQL, które ma pętle, warunki warunkowe itp. Czy więc jakikolwiek kod SQL jest domyślnie kodem PL / SQL? Czyż nie tak

Czy istnieje rozgraniczenie między SQL a PL / SQL?

Dwa przykłady różnicowania b / w SQL i PL / SQL, które wywołały to pytanie:

Jaka jest różnica między tymi dwoma instrukcjami tworzenia tabeli?

/programming/2267386/oracle-11g-varray-of-objects/2267813#2267813

Lazer
źródło

Odpowiedzi:

12

Z pewnością jest to interesujące pytanie. Większość osób, które są zaznajomione z programowaniem Oracle, nie zastanawiałaby się nad tym, ale kiedy do tego dojdzie, definiowanie rozgraniczenia między SQL a PL / SQL może być mylące.

Patrząc na definicję akronimów, zaczynasz rozumieć, jakie obszary funkcjonalności obejmują:

SQL - Structured Query Language

PL / SQL - język proceduralny / język zapytań strukturalnych

Spostrzegawczy czytelnik może zauważyć, jak SQL wyświetla się dwa razy 8) To dlatego, że SQL jest często osadzony w PL / SQL - PL / SQL to język, który został stworzony, aby zapewnić zastrzeżony język 4. generacji (4GL), który bardzo dobrze gra z obiektami bazy danych w Wyrocznia.

Wikipedia ma całkiem niezły materiał na temat SQL i PL / SQL

Zagmatwane jest to, że PL / SQL i SQL nieco się pokrywają. Zadania SQL obejmują wstawianie danych, wysyłanie zapytań, aktualizację i usuwanie, tak zwane operacje języka DML lub operacje na języku manipulacji danymi, ale obejmują także tworzenie, zmianę, zmianę nazwy, upuszczanie, które są operacjami języka DDL lub języka definicji danych. To tutaj niektórzy mogą się pomylić. Operacja tworzenia procedury składowanej, coś napisanego przy użyciu PL / SQL, jest w rzeczywistości SQL - używasz SQL do utworzenia obiektu bazy danych, który reprezentuje blok PL / SQL.

Podobnie możesz osadzić kod SQL w swoim PL / SQL. Pętla FOR w PL / SQL może być oparta na przykład na zapytaniu SQL. Nieco zdmuchuje twój umysł, co? Procedurę tworzy się za pomocą SQL, który faktycznie wewnętrznie używa SQL do wykonania pewnych działań na rekordach z bazy danych.

Fajne rzeczy, jeśli mnie zapytasz.

ScottCher
źródło
2
Rzeczywiście linia jest rozmyta. Można napisać instrukcję SQL, aby utworzyć procedurę PL / SQL z instrukcją SQL, która wywołuje funkcję PL / SQL z instrukcją SQL itp.
Leigh Riffel
1
@ Opuść króliczą norkę, idziemy!
ScottCher,
Nie powiedziałbym, że linia była w ogóle rozmyta. PL / SQL to opakowanie proceduralne dla SQL. Większość PL / SQL zawiera instrukcje SQL, chociaż nie musi. Rzeczywiste kursory SQL można prześledzić w v$sqlitp.
William Robertson,
12

Jeśli jest owinięty

  • BEGIN ... END
  • DECLARE ... END
  • CREATE OR REPLACE ... END
  • Jest prefiksem jednowierszowym EXECUTE

To jest PL / SQL. Co to znaczy pod maską? SQL zostaje „skompilowany” do planu zapytań i wykonany, natychmiast zwraca zestaw wyników w przypadku SELECTlub liczby wierszy, których dotyczy w innych przypadkach, lub błędu. PL / SQL jest jednak bardziej zaangażowany. Każdy przywoływany w nim obiekt jest sprawdzany pod kątem istnienia i niezbędnych uprawnień, a następnie PL / SQL jest kompilowany do prawie natywnego kodu , który wykonuje się z pełną prędkością. Zależności są śledzone, a jeśli tabela się zmieni, to wszelkie odniesienia do niej PL / SQL wymagają ponownej kompilacji. Powodem tego jest prędkość; ponieważ wszystko jest wykonywane z góry w czasie kompilacji, nie ma potrzeby przeprowadzania żadnych kontroli w środowisku wykonawczym w PL / SQL, podczas gdy instrukcje SQL muszą być sprawdzane za każdym razem (nawet te plany zapytań są buforowane, tak zwana miękka analiza, uprawnienia muszą być nadal sprawdzane, a nawet delikatna analiza wiąże się z tym kosztem).

Jest to jedna z „zabójczych zalet” procedur przechowywanych, podobnie jak Oracle; faktycznie wykonanie procedury lub wyzwalacza przechowywanego w PL / SQL wykonuje absolutnie minimalną ilość obliczeń, aby uzyskać wynik. Kod aplikacji działający poza jądrem Oracle, gdzie jest niezaufany, musi przeskakiwać przez więcej obręczy, aby uzyskać dostęp do danych. To ten sam argument za silnie typowymi, referencyjnie przejrzystymi językami wysokiego poziomu, takimi jak OCaml lub Haskell - wykonuj więcej pracy raz, w czasie kompilacji i czerp korzyści z miliona czasu wykonania kodu.

Gajusz
źródło
2
Aby dodać do miksu, CALL jest instrukcją SQL używaną do wykonania przechowywanej jednostki programu i jest przepisywana pod maską jako POCZĄTEK ... KONIEC
Gary
2
Podobnie jak EXECUTE, jest to cukier składniowy
Gajusz
5

Czy istnieje rozgraniczenie między SQL a PL / SQL?

SQL jest standardem *.

PL / SQL jest rozszerzeniem dostawcy standardu SQL *.

* SQL jest językiem, który ma jawną gramatykę i zasady dotyczące sposobu, w jaki ta gramatyka powinna zostać zaimplementowana i jest, ale nie jest standardem per se . Ponieważ jednak istnieje specyfikacja językowa, na którą wszyscy mogą się zgodzić, wszystko napisane w SQL byłoby przenośne, gdyby program był napisany tylko w SQL.

Ponieważ jednak PL / SQL jest rozszerzeniem dostawcy, będzie zawierał części językowe, których inni dostawcy mogą nie obsługiwać.

jcolebrand
źródło
3
Powiedziałbym, że PL / SQL jest de facto standardem, podczas gdy SQL jest de deure standardem :-)
Gaius
3
@ Gajusz i tylko z tego stwierdzenia zgaduję dwie rzeczy: jesteś programistą ORA i uważasz, że TSQL jest po prostu bałagan: p
jcolebrand
@jcolebrand Moja pierwsza praca z DBA dotyczyła Sybase, ale masz rację, obecnie pracuję głównie z Oracle. Byłbym bardzo szczęśliwy, gdybyś mógł pisać T-SQL lub PL / SQL na dowolnej bazie danych, ale języki odzwierciedlają ich platformy (np. T-SQL jest taki, ponieważ kursory i blokady są drogie w SQL Server i jego potomkach , a PL / SQL jest tak, ponieważ ktoś w Oracle ostatnio pracował w DoD) :-)
Gaius
@ Gaius Ach, tak, stary argument o tym, że standardy są tak dobre, ponieważ jest tak wiele do wyboru. Myślę, że dobrze jest wskazać, że SQL jest „standardem”, a PL / SQL jest zastrzeżony, więc +1 @jcolebrand.
ScottCher,
@ScottCher ~ Dzięki za to. Czuję się głupio mówiąc, że jest to standard, ponieważ nie ma (afaik) organu normalizacyjnego, który mógłby go opatrzyć pieczęcią zatwierdzenia i nadać mu numer. Ale jest dobrze zdefiniowane i uzgodnione. ;)
jcolebrand