在PostgreSQL中,准备好的语句和SQL或PLpgSQL函数,在目的、优劣上有什么区别?

问题描述 投票:10回答:1

在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 postgresql prepared-statement plpgsql sql-function
1个回答
8
投票

三者的 "工作原理 "是一样的,都是执行简单的SQL语句。

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

预备语句只适用于 单一 准备好的SQL语句(顾名思义)。而且只有DML命令。的手册。

任何 SELECT, INSERT, UPDATE, DELETEVALUES 语句。

函数可以包含任意数量的语句。DML DDL。只有SQL的SQL函数。加上PLpgSQL中的一些非SQL的程序元素。

准备好的语句只在同一会话内可见,在会话结束时就消失了,而函数则持久存在,对所有的人都是可见的--仍然只对那些有了 EXECUTE 特权。

编制的报表所承担的间接费用最少。(区别不大。)

SQL函数是三个函数中唯一一个不能保存查询计划(自己)的函数。在这里阅读PLpgSQL函数中计划缓存的详细信息。

SQL函数也是唯一一个可以被 内衬 当在一个更大的查询中使用。(不与 INSERT不过,)。)

比较全面的列出了SQL和PLpgSQL函数的区别。

从Postgres 11开始还有SQL存储过程。

© www.soinside.com 2019 - 2024. All rights reserved.