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)
所有三个"工作相同",因为它们执行简单的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过程:
归档时间: |
|
查看次数: |
5671 次 |
最近记录: |