根据它们的用途,预准备语句和SQL或PL/pgSQL函数之间有什么区别?

8 postgresql plpgsql prepared-statement sql-function

在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');
Run Code Online (Sandbox Code Playgroud)

Erw*_*ter 7

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

INSERT INTO foo VALUES (3, 'ben');
Run Code Online (Sandbox Code Playgroud)

准备好的语句仅适用于单个准备好的SQL语句(顾名思义).而且只有DML命令.手册:

任何SELECT,INSERT,UPDATE,DELETE,或VALUES语句.

函数可以包含任意数量的语句.DML DDL.只有SQL for SQL函数.加上PL/pgSQL中的一些非SQL过程元素.

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

准备好的陈述受到最少的开销.(差别不大.)

SQL函数是三个中唯一无法保存查询计划的函数(单独使用).在此处阅读手册中有关PL/pgSQL函数中计划缓存的详细信息.

SQL函数也是唯一一个在更大的查询中使用时可以内联的函数.(不过,不是INSERT.)

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

从Postgres 11开始,还有SQL过程:

  • 谢谢。“SQL 函数无法保存查询计划(单独)”是什么意思? (2认同)