就用途而言,准备好的语句与 SQL 或 PL/pgSQL 函数有什么区别?

What is the difference between prepared statements and SQL or PL/pgSQL functions, in terms of their purpose?

在 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 (, );
' LANGUAGE SQL; 

SELECT myfunc1(3, 'ben');

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

SELECT myfunc2(3, 'ben');

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

EXECUTE fooplan(3, 'ben');

所有三个“工作相同”,因为它们执行简单的 SQL 语句:

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

准备好的语句只适用于单个准备好的SQL语句(顾名思义)。并且只有 DML 命令。 The manual:

Any SELECT, INSERT, UPDATE, DELETE, or VALUES statement.

该函数可以包含任意数量的语句。 DML DDL。只有 SQL 用于 SQL 函数。加上 PL/pgSQL.

中的一些非 SQL 程序元素

准备好的语句只在同一个会话中可见,并在会话结束时消失,而函数仍然存在并且对所有人可见 - 仍然只对具有 EXECUTE 特权的人可用。

预处理语句的开销最小。 (差别不大。)

SQL 函数是三个函数中唯一不能保存查询计划(自身)的函数。 Read details about plan caching in PL/pgSQL functions in the manual here.

SQL 函数也是唯一一个在更大的查询中使用时可以 inlined 的函数。 (不过 INSERT 不行。)

SQL 和 PL/pgSQL 函数之间的相当全面的差异列表:

  • Difference between language sql and language plpgsql in PostgreSQL functions

从 Postgres 11 开始还有 SQL 程序: