就它们的用途而言,预备语句与SQL或PL / pgSQL函数之间有什么区别?

时间:2018-06-27 00:10:07

标签: postgresql prepared-statement plpgsql 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');

1 个答案:

答案 0 :(得分:5)

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

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

prepared语句仅对 single 预先准备的SQL语句(如名称所示)有用。而且只有DML命令。 The manual:

  

任何SELECTINSERTUPDATEDELETEVALUES语句。

函数可以包含任意数量的语句。 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过程: