PL/pgSQL:执行与调用

Awe*_*ler 9 postgresql procedure function plpgsql

在研究从另一个过程调用一个过程与在 Postgres 13 中重复代码对性能的影响时,我发现您可以使用 或 来调用其他CALL过程PERFORM

我用谷歌搜索差异,但我发现的唯一相似的事情是

哪些地址PERFORMvs.哪些地址EXECUTEPERFORMvs. CALL.

有谁知道有什么区别?我应该使用哪一个(当从 PL/pgSQL 过程调用过程时)?

Erw*_*ter 14

CALL是一个用于执行 a 的SQL 命令PROCEDURE,是在添加 SQL 过程时随 Postgres 11 添加的。例子:

CALL my_procedure('arg1');
Run Code Online (Sandbox Code Playgroud)

SELECT执行FUNCTION.​ 例子:

SELECT my_function('arg1');
Run Code Online (Sandbox Code Playgroud)

PERFORM是一个PL/pgSQL命令,用于替换SELECT关键字(在其他普通 SQLSELECT命令中)并丢弃任何结果。例子:

...
BEGIN
   PERFORM my_function('arg1');
END
...
Run Code Online (Sandbox Code Playgroud)

EXECUTE是执行(动态生成的)SQL 字符串的PL/pgSQL 命令。允许任何完整的 SQL 命令,而不仅仅是SELECT. 例子:

...
BEGIN
   EXECUTE my_string_variable
   USING arg1;
END
...
Run Code Online (Sandbox Code Playgroud)

SQL 字符串可以包含CALLSELECT或任何其他 SQL 命令。但引用该USING子句的参数符号只允许作为 DML 命令中的数据元素SELECTINSERTUPDATEDELETE、 and MERGE(这些符号不能用来代替表名等)。

INTO除非添加子句,否则结果将被自动丢弃。


你不能是CALL一个函数。
你不能SELECTPERFORM一个程序。
您不能PERFORM使用EXECUTE、 或EXECUTEa PERFORM,它们都不是 SQL 命令。

db<>在这里摆弄

有关的: