Находятся ли PL / pgSQL и SQL в PostgreSQL на одном уровне со стандартом SQL / PSM, а не только со стандартом SQL?

Терминология: Далее, сервер PostgreSQL понимает два типа языков.

  • PL / pgSQL;
  • Я использую и «PostgreSQL SQL», и «SQL в PostgreSQL» для обозначения одного и того же, языка по умолчанию для команд, получаемых сервером PostgreSQL. «PostgreSQL SQL», то есть «SQL в PostgreSQL» - это не то же самое, что и SQL по стандарту SQL.

Я нашел следующие наблюдения:

  • И SQL в PostgreSQL, и PL / pgSQL могут создавать функции (фактически хранимые процедуры) с помощью своих собственных операторов CREATE FUNCTION. Читаю Разница между языком sql и языком plpgsql в функциях PostgreSQL

  • Но PL / pgSQL позволяет присваивать переменные, а я не считаю, что SQL в PostgreSQL позволяет присваивать переменные.

Поскольку PostgreSQL SQL имеет CREATE FUNCTION, а стандарт SQL не имеет хранимых процедур, находится ли SQL в PostgreSQL на том же уровне, что и стандарт SQL / PSM, а не только как стандарт SQL?

Находятся ли SQL в PostgreSQL и PL / pgSQL на одном уровне со стандартом SQL / PSM?

Какая связь между PL / pgSQL и PostgreSQL SQL?

  • Является ли PL / pgSQL процедурным расширением SQL в PostgreSQL, но в PostgreSQL SQL уже есть CREATE FUNCTION?

  • Является ли PL / pgSQL альтернативой SQL в PostgreSQL? Можно ли большую часть того, что PL / pgSQL делать, также можно сделать в PostgreSQL SQL?

Если и PL / pgSQL, и SQL в PostgreSQL находятся на том же уровне, что и SQL / PSM, какой из них более точно следует стандарту SQL / PSM?

Спасибо.


Больше предыстории:

Я узнал, что мы должны использовать команду DO в PostgreSQL SQL, чтобы указать с помощью PL / pgSQL, иначе команды просто в PostgreSQL SQL. В MySQL мне никогда не приходилось делать подобные вещи, а просто писать команды MySQL. Поэтому мне непонятно, почему у нас есть и PL / pgSQL, и PostgreSQL SQL, и мы должны использовать PL / pgSQL в PostgreSQL SQL с помощью команды DO, вместо того, чтобы просто использовать один из них без неудобств, связанных с смешиванием PL / pgSQL в PostgreSQL SQL.

«может ли то, что можно сделать в PL / pgSQL, также можно сделать в SQL в PostgreSQL» нет - SQL не имеет IF, циклов, переменных или других элементов процедурного языка.

a_horse_with_no_name 14.06.2018 15:45

Вы не можете писать процедурный код (циклы, операторы if, курсоры и т. д.) В MySQL вне хранимой процедуры или функции, поэтому я не понимаю, как это связано с оператором DO - который является способом написания процедурного кода без хранимого функция (или процедура)

a_horse_with_no_name 14.06.2018 16:00

«Я не понимаю, почему у нас есть оба PL / pgSQL SQL» - потому что SQL (язык запросов) не имеет процедурных элементов - все просто.

a_horse_with_no_name 14.06.2018 16:01

Спасибо. Повторите свой последний комментарий. Я говорю не о стандарте SQL, а о PostgreSQL SQL. PostgreSQL SQL имеет собственный CREATE FUNCTION.

Tim 14.06.2018 16:03

Но SQL не имеет процедурных элементов

a_horse_with_no_name 14.06.2018 16:04

Спасибо. В чем разница между хранимой процедурой и «процедурными элементами»?

Tim 14.06.2018 16:05
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
6
802
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

SQL - это язык запросов, а PL / pgSQL - процедурный язык (в нем есть такие операторы, как LOOP и IF).

Для написания функций используются процедурные языки; тело функции может быть написано на PL / pgSQL.

CREATE FUNCTION - это оператор SQL, который определяет объект функции в базе данных. Такую функцию можно использовать в выражениях SQL.

SQL / PSM является частью стандарта, который определяет язык хранимых процедур, поэтому SQL / PSM будет применим к PL / pgSQL, но не к SQL.

Однако PL / pgSQL не следует стандарту SQL / PSM.

Никто не говорит вам, что вы должны использовать PL / pgSQL, и это действительно делает ваше приложение более переносимым (на стороне базы данных), чтобы не использовать его. Но SQL и процедурные языки - это нечто иное (как в PostgreSQL, так и в MySQL), и вы можете обнаружить, что оба имеют свое применение.

Ответ принят как подходящий

Чтобы прояснить терминологию:

SQL - это язык запрос, который используется для выбора, обновления, удаления или создания данных в реляционной базе данных. В нем нет циклов, подобных процессуальные элементы (FOR, WHILE), условных операторов (IF, ELSE), переменных или курсоров.

CREATE FUNCTION действительно является «оператором SQL», но является просто «оболочкой» для указания блока кода, который выполняется чем-то отличным от «механизма» запроса SQL. Postgres (в отличие от других СУБД) поддерживает несколько «механизмов выполнения», которые могут выполнять блок кода, который был передан оператору «CREATE FUNCTION» - одним из артефактов этого является то, что код на самом деле является строкой, поэтому CREATE FUNCTION видит только строку, ничего еще.

Поскольку в SQL нет процедурных элементов, нельзя смешивать процедурный код и код SQL. Если вы хотите запустить процедурный код, вам нужно сообщить серверу, что вы каким-то образом переключаете «движки». Это делается с помощью (SQL) команды DO, которая снова берет строку, с которой не знает, что делать, отправляет ее на сервер и говорит: «Вот фрагмент кода, в котором пользователь утверждал, что движок 'xyz' может выполнить »- xyz - это либо PL / pgSQL, Python, Perl, либо что-то совершенно другое.

Это то же самое, что и анонимный блок PL / SQL в Oracle, который вы запускаете с DECLARE - все после этого выполняется другим механизмом выполнения на сервере. MySQL не имеет такой возможности. Единственный способ запустить процедурный код - создать процедуру (или функцию), а затем запустить ее. Вот почему в MySQL нет такой вещи, как DO.

Единственный продукт СУБД, который не делает четкого различия между процедурным кодом и "простым SQL", - это SQL Server: T-SQL - это расширение языка SQL, которое позволяет вам смешивать "обычный SQL" и процедурный SQL, не сообщая серверной части, что код требуется другой движок для работы (что является источником большой путаницы для людей, переходящих с SQL Server на Postgres или Oracle).

SQL / PSM - это стандарт, определяющий процедурные элементы, которые могут быть встроены в ядро ​​базы данных, использующее SQL в качестве языка запросов. Я не знаю ни одного продукта СУБД, который действительно реализует SQL / PSM. PL / pgSQL от Postgres, PL / SQL от Oracle, процедурный диалект MySQL в чем-то похожи на него, но далеки от соответствия стандарту SQL / PSM. Я думаю, что ближе всего к стандарту SQL / PSM является DB2 и, возможно, HSQLDB


SQL in PostgreSQL" is not the same thing as SQL per SQL standard.

Это правда. Но тогда СУБД нет полностью реализует стандарт SQL, но реализация Postgres, вероятно, наиболее близка к стандарту.

Спасибо. «CREATE FUNCTION действительно является« оператором SQL »», вы имеете в виду, что стандарт SQL имеет CREATE FUNCTION или аналогичный?

Tim 14.06.2018 18:07

Еще раз спасибо. Что означает код, следующий за строкой CREATE FUNCTION: stackoverflow.com/questions/50867972/…

Tim 15.06.2018 03:18

@Tim: в двух словах: код, который запускает create function, не может проверить правильность кода в строке - он должен быть передан для проверки механизму, который позже запускает код что.

a_horse_with_no_name 15.06.2018 07:25

Спасибо. Считается ли это динамическим SQL? Предотвращает ли он или представляет риск внедрения SQL-кода по сравнению с динамическим SQL?

Tim 15.06.2018 13:20

Другие вопросы по теме