在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');
答案 0 :(得分:5)
所有三个“工作原理相同”,因为它们执行简单的SQL语句:
INSERT INTO foo VALUES (3, 'ben');
prepared语句仅对 single 预先准备的SQL语句(如名称所示)有用。而且只有DML命令。 The manual:
任何
SELECT
,INSERT
,UPDATE
,DELETE
或VALUES
语句。
函数可以包含任意数量的语句。 DML 和 DDL。仅SQL for 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函数之间的差异的相当全面的列表:
从Postgres 11开始,还有SQL过程: