一尘不染

就用途而言,准备好的语句与SQL或PL / pgSQL函数有什么区别?

sql

在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');

阅读 146

收藏
2021-03-17

共1个答案

一尘不染

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

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

预处理语句仅适用于 _单个_预处理SQL语句(顾名思义)。而且只有DML命令。手册:

任何SELECTINSERTUPDATEDELETE,或VALUES语句。

函数可以包含任意数量的语句。DML DDL。只有SQL for SQL函数。在PL / pgSQL中加上一些非SQL过程元素。

准备好的语句仅在同一会话内可见,并在会话结束时消失,而这些函数将保留并对所有人可见-仍然仅对具有EXECUTE特权的用户可用。

准备好的语句的开销最少。(相差不大。)

SQL函数是三个不能保存查询计划(仅凭其自身)的唯一函数。在此处阅读有关PL /
pgSQL函数中计划缓存的详细信息。

当在较大的查询中使用SQL函数时,它也是唯一可以 内联的
函数。(但不带有INSERT。)

2021-03-17