Официально PostgreSQL имеет только «функции». Триггерные функции иногда называют «триггерными процедурами», но это использование не имеет определенного значения. Внутренне функции иногда называют процедурами, например, в системном каталоге pg_proc
. Это пережиток PostQUEL. Любые функции, которые некоторые люди (возможно, имеющие опыт работы в разных системах баз данных) могут связывать с процедурами, например их актуальность для предотвращения SQL-инъекций или использования выходных параметров, также применяются к функциям, существующим в PostgreSQL.
Теперь, когда люди в сообществе PostgreSQL говорят о «хранимых процедурах» или «реальных хранимых процедурах», они часто имеют в виду гипотетическую особенность функционально-подобного объекта, который может запускать и останавливать транзакции в его теле, чего не могут делать текущие функции. делать. Использование термина «хранимая процедура» в этом контексте, по-видимому, аналогично другим продуктам баз данных. Посмотрите эту ветку списка рассылки для расплывчатой идеи.
На практике, однако, это различие между функцией и процедурой с точки зрения их возможностей управления транзакциями не является общепринятым, и, безусловно, многие программисты без смещения базы данных будут воспринимать процедуру как функцию без возвращаемого значения в стиле Паскаля. (Стандарт SQL, по-видимому, занимает промежуточное положение в том смысле, что процедура по умолчанию имеет другое поведение транзакции, чем функция, но это можно отрегулировать для каждого объекта.) Так что в любом случае, особенно при рассмотрении вопросов в Stack Exchange с очень смешанная аудитория, вы должны избегать слишком большого количества слов и использовать более четкие термины или определять ожидаемые свойства.
Питер Айзентраут
источник
Сравнивая принятый ответ с абстрактного концептуального уровня, я понимаю разницу с точки зрения функциональности и ввода / вывода. Ниже я использовал sp и f для представления хранимой процедуры и функции соответственно.
Используйте в выражении: sp нельзя использовать в выражении, тогда как функция может, что означает, что вы можете использовать возвращаемое значение из af внутри других операторов, например
вернуть значение: sp не возвращает значение автоматически, если вы не укажете тип возврата refcursor , откроете и вернете курсор; f возвращает результат в последнем операторе, в который вставлено предложение return, как предложение select .
возвращать наборы результатов одного / нескольких: здесь наборы результатов относятся к списку результатов, которые могут различаться по формату, например, набор из одного целого числа, текстового массива и двух таблиц. sp может возвращать несколько наборов, пока вы указываете тип возвращаемого значения refcursor, открываете и возвращаете курсор. Однако f может возвращать только один тип набора.
Обычно хранимые процедуры используются для изменения данных или структуры базы данных, где возвращаемое значение не требуется, например, удаление, обновление, удаление и т. Д .; или ситуации, когда требуется несколько наборов результатов. Функция, с другой стороны, в основном выбирается для простых запросов.
Для более подробной информации относительно моего объяснения, пожалуйста, обратитесь к этой ссылке: Хранимые процедуры и функции в PostgreSQL
источник