Які відмінності між "Збереженими процедурами" та "Збереженими функціями"?


36

Тож у коментарі до цього питання зазначається, що в PostgreSQL є невелика різниця у "Збережених процедурах" та "Збережених функціях".

Коментар посилається на статтю вікіпедії, але деякі з них, схоже, не застосовуються (наприклад, вони можуть бути використані у SELECTзаяві).

Сам синтаксис здається трохи заплутаним:

CREATE FUNCTION emp_stamp() RETURNS trigger AS $emp_stamp$
    BEGIN
       [...]
    END;
$emp_stamp$ LANGUAGE plpgsql;

CREATE TRIGGER emp_stamp BEFORE INSERT OR UPDATE ON emp
    FOR EACH ROW EXECUTE PROCEDURE emp_stamp();

Ви створюєте, FUNCTIONале називаєте це як PROCEDURE.

То яка різниця між цими двома?

Відповіді:


43

Офіційно PostgreSQL має лише "функції". Функції тригера іноді називають "тригерними процедурами", але використання цього не має чіткого значення. Внутрішньо, функції іноді називають процедурами, такими як у системному каталозі pg_proc. Це підтвердження від PostQUEL. Будь-які функції, які деякі люди (можливо, мають досвід роботи в різних системах баз даних) можуть пов'язувати з такими процедурами, як їх відповідність запобіганню ін'єкцій SQL або використанню вихідних параметрів, також застосовуються до функцій, які вони існують у PostgreSQL.

Тепер, коли люди у спільноті PostgreSQL говорять про "збережені процедури" або "реальні збережені процедури", однак, вони часто означають гіпотетичну особливість об'єкта, подібного до функцій, який може запускати та зупиняти транзакції у своєму тілі, те, що поточні функції не можуть робити. Використання в цьому контексті терміна "збережена процедура" є аналогічним до інших продуктів бази даних. Побачити цю тему списку розсилки, щоб отримати нечітку ідею.

На практиці, однак, таке розмежування функції від процедури з точки зору їх можливостей контролю транзакцій не є загальновизнаним, і, безумовно, багато програмістів без упередженості бази даних приймуть інтерпретацію подібної Паскалю процедури як функції без зворотного значення. (Здається, стандарт SQL займає середнє місце, оскільки процедура за замовчуванням має інше поведінку транзакцій, ніж функція, але це може бути відрегульовано для кожного об'єкта.) Отже, у будь-якому випадку, особливо, коли ми розглядаємо питання щодо Stack Exchange з дуже змішана аудиторія, вам слід уникати занадто багато і використовувати чіткіші терміни або визначати властивості, які ви очікуєте.


14

З точки зору DDL, Postgres не має об'єктів процедури, а лише функцій. Функції Postgres можуть повертати значення (значення) або недійсні, тому вони беруть на себе роль і функцій, і процедур в інших RDBMS. Слово "процедура" у текстіcreate trigger вказує на функцію.

З точки зору документації Postgres, "процедура" також є синонімом об'єкта бази даних, який називається функцією, наприклад: " Процедура запуску створюється командою CREATE FUNCTION ".

"Процедури" тригера мають особливі правила: вони повинні бути оголошені функцією без аргументів і типом повернення тригера . Приклад тут .


8

Терміни "збережена процедура" і "збережена функція" в PostgreSQL вживаються взаємозамінно і зазвичай прийнято означати те саме. Інші бази даних можуть відрізняти процедуру та функцію (подібно до того, як VB розмежовує підпрограми та функції).

Поки функція в PostgreSQL повертає щось, що нагадує таблицю, ви можете використовувати вихід цієї функції так, як якщо б це була стандартна таблиця. TheCREATE TRIGGERСинтаксис трохи заплутаним, але я підозрюю , що це може бути на місці до того , як стандарт ANSI був завершений. У мене є лише копія SQL: 2003, тому я не можу зробити більше, ніж міркувати, чому номенклатура дивна.

Версія TL; DR: для PostgreSQL "процедура" еквівалентна "функції".


6

У MSSQL збережена процедура - це попередньо складений набір команд sql.
Збережена процедура:

 - може мати багато вхідних і вихідних параметрів
 - може використовуватися для зміни таблиць / структур / даних баз даних
 - зазвичай не використовуються всередині операторів вставлення / оновлення / видалення / вибору
Функції, визначені користувачем, мають декілька варіантів. Залежно від типу написаної функції, функції:
  - може мати кілька вхідних параметрів, але повертати лише одне значення (тобто об'єднання рядків)
  - може прийняти набір як вхід, повернути єдине значення (тобто dbo.FindLargestPig (ListOfPigs))
  - повернути таблицю (тобто виберіть * від dbo.ExplodeString ("це список слів"))
  - може використовуватися у операторах вибору / вставки / оновлення / видалення
  - НЕ можна використовувати для зміни таблиць / структур / даних баз даних


5

Коротка відповідь полягає в тому, що функція повертає значення, але процедура не робить.

Ця відмінність була присутня в стійких збережених модулях (SQL / PSM), запропонованих для SQL 1992 року. Я не знаю, чи SQL / PSM коли-небудь входив у стандарти.


до 2003 р. Я вважаю
ксенотерацид

Це звучить надзвичайно як синтаксис для VB. Функція повертає значення, а процедура ні (тому якщо у вас було значення повернення у функції, воно
підірветься

@jcolebrand Власне, імена більш помітні в Паскалі. Процедура не повертає результат, в той час як функція робить. З історичних причин, VBA використовує мову FORTRAN, який називає (під назвою?) Їх SUBROUTINE і FUNCTION . Сучасні мови типу C просто мають функції, але введені мови мають можливість недійсних функцій, які є процедурами з іншою назвою. Популярна тенденція - просто використовувати звичайні функції для всього і повертати те, що можна ігнорувати, якщо ви хочете.
Манго

2

Порівнюючи прийняту відповідь з абстрактного концептуального рівня, я розумію різницю з функціональності та точки зору введення / виводу. Нижче я використовував sp і f для представлення відповідно збереженої процедури та функції.

  1. Використання в виразі: sp не може бути використаний у виразі, поки функція може, а це означає, що ви можете використовувати повернене значення af з інших операторів, наприклад

    select * 
    from table 
    where col_a < (select col_A from f())
  2. повернути значення: sp автоматично не повертає значення, якщо не вказати тип повернення рекурсора , відкрити та повернути курсор; f повертає результат в останньому операторі, куди вбудовано пропозицію "return", як пункт вибору .

  3. повернути один / кілька наборів результатів: тут набори результатів посилаються на список результатів, який може відрізнятися за форматом, як набір одиничного цілого числа, текстовий масив та дві таблиці. sp може повернути кілька наборів, якщо ви вказали тип повернення рекурсора, відкрийте та поверніть курсор. Однак f може повернути лише один тип набору.

Зазвичай, що зберігаються процедури використовуються для зміни даних або структури бази даних там, де значення повернення не потрібно, наприклад видалення, оновлення, випадання тощо; або ситуації, коли потрібно кілька наборів результатів. Функція, з іншого боку, вибирається здебільшого для звичайних запитів.

Детальніше про моє пояснення перейдіть за цим посиланням: Збережені процедури та функції в PostgreSQL

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.