在PostgreSQL中,准备好的语句和SQL或PLpgSQL函数,从它们的目的、优缺点来看,有什么区别?我们什么时候该用哪个?
在这个很简单的例子中,它们的工作原理是一样的,正确吗?
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');
三者的 "工作原理 "是一样的,都是执行简单的SQL语句。
INSERT INTO foo VALUES (3, 'ben');
预备语句只适用于 单一 准备好的SQL语句(顾名思义)。而且只有DML命令。的手册。
任何
SELECT
,INSERT
,UPDATE
,DELETE
或VALUES
语句。
函数可以包含任意数量的语句。DML 和 DDL。只有SQL的SQL函数。加上PLpgSQL中的一些非SQL的程序元素。
准备好的语句只在同一会话内可见,在会话结束时就消失了,而函数则持久存在,对所有的人都是可见的--仍然只对那些有了 EXECUTE
特权。
编制的报表所承担的间接费用最少。(区别不大。)
SQL函数是三个函数中唯一一个不能保存查询计划(自己)的函数。在这里阅读PLpgSQL函数中计划缓存的详细信息。
SQL函数也是唯一一个可以被 内衬 当在一个更大的查询中使用。(不与 INSERT
不过,)。)
比较全面的列出了SQL和PLpgSQL函数的区别。
从Postgres 11开始还有SQL存储过程。