Как отличить SQL от PL / SQL?

16

Я знаю, что вопрос может показаться слишком глупым, но я никогда не понимал эту часть.

SQL * Plus работает как с SQL, так и с PL / SQL. Как мне узнать, является ли какой-то код SQL или PL / SQL? Если в моем коде есть цикл for, это уже не SQL?

PL / SQL является расширением для SQL, чтобы иметь циклы, условные выражения и т. Д. Тогда любой код SQL по умолчанию является кодом PL / SQL? Не правда ли?

Есть ли разграничение между SQL и PL / SQL?

Два примера разграничения ч / б SQL и PL / SQL, которые вызвали этот вопрос:

В чем разница между этими двумя операторами создания таблиц?

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

Lazer
источник

Ответы:

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 для выполнения некоторых действий с записями из базы данных.

Классные вещи, если вы спросите меня.

ScottCher
источник
2
Действительно, линия размыта. Вы можете написать инструкцию SQL, чтобы создать процедуру PL / SQL, в которой есть оператор SQL, который вызывает функцию PL / SQL, в которой есть оператор SQL и т. Д.
Ли Риффель
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, - выполняйте больше работы один раз, во время компиляции, и получайте преимущества в миллионы раз, когда код выполняется.

Gaius
источник
2
Для добавления в смесь CALL - это оператор SQL, используемый для выполнения хранимой программной единицы, и он перезаписывается как BEGIN ... END
Gary
2
Как EXECUTE, это синтаксический сахар
Gaius
5

Есть ли разграничение между SQL и PL / SQL?

SQL - это стандарт *.

PL / SQL - это расширение поставщика к стандарту SQL *.

* SQL - это язык, который имеет явную грамматику и правила того, как эта грамматика должна быть реализована, и является, но не является стандартным per se . Однако, поскольку существует спецификация языка, с которой все могут согласиться, то все, что написано на SQL, будет переносимым, если программа будет написана только на SQL.

Но поскольку PL / SQL является расширением поставщика, в нем будут языковые части, которые другие поставщики могут не поддерживать.

Jcolebrand
источник
3
Я бы сказал, что PL / SQL является стандартом де-факто, в то время как SQL является стандартом де-юре :-)
Гай
3
@ Гай и только из этого утверждения я бы догадался о двух вещах: ты разработчик ORA, и ты думаешь, что TSQL просто грязный: p
jcolebrand
@jcolebrand Моя первая работа с DBA была на Sybase, но вы правы, я в основном работаю с Oracle в эти дни. Я был бы очень рад, если бы вы могли писать либо T-SQL, либо PL / SQL для любой базы данных, но языки отражают их платформы (например, T-SQL так и есть, потому что курсоры и блокировки дороги в SQL Server и его потомках) и PL / SQL так и есть, потому что кто-то в Oracle последний раз работал в DoD) :-)
Гай
@Gaius Ах, да, старый аргумент о том, что стандарты настолько хороши, потому что есть из чего выбирать. Я думаю, что хорошо указывать, что SQL является «стандартом», а PL / SQL является проприетарным, поэтому +1 @jcolebrand.
ScottCher
@ScottCher ~ Спасибо за это. Я чувствую себя глупо, говоря, что это стандарт, потому что нет (afaik) органа по стандартизации, чтобы поставить его печатью одобрения и дать ему номер. Но это хорошо определено и согласовано. ;)
jcolebrand