В чем разница между подготовленным оператором и функцией SQL или PL / pgSQL с точки зрения их целей? - PullRequest
0 голосов
/ 27 июня 2018

В PostgreSQL, в чем разница между подготовленным оператором и функцией SQL или PL / pgSQL, с точки зрения их целей, преимуществ и недостатков? Когда мы будем использовать какие?

В этом очень простом примере они работают одинаково, верно?

CREATE TABLE foo (id INT, name VARCHAR(80)); 

CREATE FUNCTION myfunc1(INT, VARCHAR(80)) RETURNS void AS ' 
INSERT INTO foo VALUES ($1, $2);
' LANGUAGE SQL; 

SELECT myfunc1(3, 'ben');

CREATE FUNCTION myfunc2(INT, VARCHAR(80)) RETURNS void AS ' 
BEGIN
INSERT INTO foo VALUES ($1, $2);
END' LANGUAGE plpgsql; 

SELECT myfunc2(3, 'ben');

PREPARE fooplan (INT, VARCHAR(80)) AS
    INSERT INTO foo VALUES($1, $2);
PREPARE

EXECUTE fooplan(3, 'ben');

1 Ответ

0 голосов
/ 27 июня 2018

Все три «работают одинаково» в том смысле, что они выполняют простую инструкцию SQL:

INSERT INTO foo VALUES (3, 'ben');

Подготовленный оператор подходит только для одного подготовленного оператора SQL (как следует из названия). И только команды DML. Руководство:

Любой оператор SELECT, INSERT, UPDATE, DELETE или VALUES.

Функции могут содержать любое количество операторов. DML и DDL. Только SQL для функций SQL. Плюс некоторые не-SQL процедурные элементы в PL / pgSQL.

Подготовленный оператор виден только в том же сеансе и ушел в конце сеанса, в то время как функции сохраняются и видны всем - все еще могут использоваться только теми, кто имеет привилегию EXECUTE.

Подготовленный оператор обременен наименьшими накладными расходами. (Не большая разница.)

Функция SQL - единственная из трех, которая не может сохранить план запроса (сам по себе). Подробнее о кэшировании плана в функциях PL / pgSQL см. Здесь.

Функция SQL также единственная, которая может быть встроенной при использовании в запросе большего размера. (Не с INSERT, хотя.)

Довольно полный список различий между функциями SQL и PL / pgSQL:

Начиная с Postgres 11, существуют также процедуры SQL:

...