Як розмежовувати SQL від PL / SQL?


16

Я знаю, що питання може здатися занадто дурним, але я ніколи не розумів цю частину.

SQL * Plus працює як з SQL, так і з PL / SQL. Як дізнатися, чи є якийсь код SQL чи PL / SQL? Якщо мій код має цикл for, це вже не SQL?

PL / SQL - це розширення для SQL, щоб мати петлі, умовні умови тощо. Тоді будь-який код SQL за замовчуванням є PL / SQL-кодом? Чи не так?

Чи є розмежування між SQL та PL / SQL?

Два приклади розрізнення b / w SQL та PL / SQL, які викликали це питання:

Яка різниця між цими двома операторами створення таблиць?

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

Відповіді:


12

Це цікаве питання, напевне. Більшість людей, які знайомі з розробкою Oracle, не задумуються над цим, але коли ви сходите до неї, це іноді заплутано визначає розмежування між SQL та PL / SQL.

Переглядаючи визначення абревіатур, ви починаєте отримувати уявлення про те, які області функціонування охоплює кожен:

SQL - структурована мова запитів

PL / SQL - Процедурна мова / Структурована мова запитів

Читач, що спостерігає, може помітити, як SQL з'являється двічі 8) Це тому, що SQL часто вбудований в PL / SQL - PL / SQL - це мова, створена для надання власного мови 4-го покоління (4GL), який дуже добре відтворює об'єкти бази даних у Oracle.

У Вікіпедії є досить непоганий матеріал як для SQL, так і для PL / SQL

Заплутана частина полягає в тому, що PL / SQL і SQL трохи перекриваються. Сфера використання SQL включає введення даних, запит, оновлення та видалення, так званий DML або мовні операції з маніпулюванням даними, але він також включає створення, зміну, перейменування, падіння, які є операціями DDL або мовою визначення даних. Тут, де дехто може заплутатися. Операція по створенню збереженої процедури, написаної за допомогою PL / SQL, насправді є SQL - ви використовуєте SQL для створення об’єкта бази даних, що представляє собою блок PL / SQL.

Так само ви можете вбудувати SQL-код у свій PL / SQL. Цикл FOR в PL / SQL може базуватися, наприклад, на запиті SQL. Трохи дує розум, так? Ви створюєте процедуру за допомогою SQL, яка фактично внутрішньо використовує SQL для виконання певних дій над записами з бази даних.

Класні речі, якщо ви запитаєте мене.


2
Дійсно, лінія розмита. Ви можете написати оператор SQL, щоб створити процедуру PL / SQL, у якій є оператор SQL, який викликає функцію PL / SQL, яка містить у собі оператор SQL тощо.
Leigh Riffel

1
@Засвітліть кролячу нору!
ScottCher

Я б не сказав, що лінія взагалі розмита. PL / SQL - це процедурна обгортка для SQL. Більшість PL / SQL містить оператори SQL, хоча цього не потрібно. Ви можете простежити фактичні курсори SQL в v$sqlін.
Вільям Робертсон

12

Якщо він загорнутий

  • BEGIN ... END
  • DECLARE ... END
  • CREATE OR REPLACE ... END
  • Це однополосний префікс EXECUTE

Тоді це PL / SQL. Що це означає під кришкою? SQL "компілюється" до плану запитів і виконується, негайно повертаючи набір результатів у випадку, SELECTабо кількість рядків, постраждалих в інших випадках, або помилку. Однак PL / SQL більше задіяний. Кожен об'єкт, на який посилається в ньому, перевіряється на наявність та необхідні гранти, потім PL / SQL збирається до корінного коду , який виконується на повній швидкості. Залежності відслідковуються, і якщо таблиця змінюється, то будь-яка PL / SQL, на яку вона посилається, вимагає перекомпіляції. Причиною цього є швидкість; оскільки все робиться наперед в момент компіляції, не потрібно проводити перевірки виконання у PL / SQL, тоді як оператори SQL потрібно перевіряти кожен раз (навіть кешовані плани запитів кешуються, так званий м'який аналіз, привілеї потрібно все-таки перевірити, і навіть м'який розбір пов'язаний з вартістю).

Це одна з "вбивчих переваг" зберігаються процедур, як це робить Oracle; фактично виконання PL / SQL, збереженого протоколу або тригера, робить абсолютну мінімальну кількість обчислень для отримання результату. Код програми, що працює поза ядром Oracle, де йому не довіряють, повинен проскочити більше обручів, щоб отримати дані. Це той самий аргумент для сильно типізованих, референційно прозорих мов високого рівня, таких як OCaml або Haskell - виконайте більше роботи один раз, під час компіляції та отримайте переваги мільйонів разів, коли виконується код.


2
Додавання до суміші CALL - це оператор SQL, який використовується для виконання збереженого програмного блоку, і він перезаписується під кришкою як ПОЧАТОК ... Кінець
Gary

2
Як і ВИКОНАННЯ, це синтаксичний цукор
Гай

5

Чи є розмежування між SQL та PL / SQL?

SQL - це стандарт *.

PL / SQL - розширення постачальника до стандарту SQL *.

* SQL це мова , яка має явну граматику і правила для того, як повинні бути реалізовані , що граматика, і , але не є стандартним в-се . Однак, оскільки існує мовна специфікація, з якою всі можуть погодитися, то все, що написано в SQL, було б портативним, якби програма була написана тільки в SQL.

Але оскільки PL / SQL є розширенням постачальника, у ньому будуть мовні частини, які інші постачальники можуть не підтримувати.


3
Я б сказав, що PL / SQL є де-факто стандартом, тоді як SQL є стандартом де-юре :-)
Гай

3
@Gaius, і тільки з цього твердження я б здогадався про дві речі: ти диктор ORA, і ти вважаєш, що TSQL просто безладний: p
jcolebrand

@jcolebrand Моя перша робота DBA була насправді на Sybase, але ти маєш рацію, я в основному працюю з Oracle в наші дні. Я був би дуже радий, якби ви могли написати або T-SQL, або PL / SQL в будь-якій базі даних, але мови відображають їх платформи (наприклад, T-SQL є таким, як це відбувається, тому що курсори та блокування дорогі в SQL Server та його нащадках , а PL / SQL - це так, тому що хтось із Oracle востаннє працював у DoD) :-)
Гай

@ Гай Ага, так, старий аргумент про те, що стандарти настільки хороші, тому що їх так багато на вибір. Я думаю, що добре вказати, що SQL є "стандартним", і що PL / SQL є власником, тому +1 @jcolebrand.
ScottCher

@ScottCher ~ Дякую за це. Я почуваюсь німим, кажучи, що це стандарт, тому що немає (afaik) органу зі стандартів, який би відбивав це печаткою схвалення та давав йому номер. Але це чітко визначено та узгоджено. ;)
jcolebrand
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.