【问题标题】:What is the difference between prepared statements and SQL or PL/pgSQL functions, in terms of their purpose?就其用途而言,准备好的语句和 SQL 或 PL/pgSQL 函数有什么区别?
【发布时间】:2018-12-05 18:22:01
【问题描述】:

在 PostgreSQL 中,prepared statement 与 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');

【问题讨论】:

    标签: sql postgresql prepared-statement plpgsql sql-function


    【解决方案1】:

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

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

    准备好的语句只适用于单个准备好的 SQL 语句(顾名思义)。而且只有 DML 命令。 The manual:

    任何SELECTINSERTUPDATEDELETEVALUES 声明。

    函数可以包含任意数量的语句。 DML DDL。只有 SQL 用于 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 过程:

    【讨论】:

    • 谢谢。 “SQL 函数不能(单独)保存查询计划”是什么意思?
    • @Ben:Prepared statements 保存查询计划以在同一会话中重复执行。 PL/pgSQL 函数将语句有效地视为准备好的语句。 SQL 函数没有。但是,在保存了计划的查询中使用 SQL 函数时,仍可能间接保存查询计划。
    • 谢谢。 PostgreSQL文档说“PREPARE语句执行时,指定语句被解析分析重写 . 当随后发出EXECUTE命令时,准备好的语句被计划执行。这种分工避免了重复的解析分析工作,同时允许执行计划取决于提供的特定参数值。”类似地,定义一个 SQL 函数并使用一些参数调用 SQL 函数是什么感觉?
    • 另外,更大查询中的“内联”对于 SQL 函数意味着什么?
    • 我在上面提供的链接答案中的更多详细信息:stackoverflow.com/questions/24755468/…
    猜你喜欢
    • 1970-01-01
    • 2018-07-05
    • 1970-01-01
    • 1970-01-01
    • 2018-12-02
    • 1970-01-01
    • 2023-03-19
    • 2011-07-22
    相关资源
    最近更新 更多