返回 PostgreSQL 中存储过程的值

Pur*_*sai 15 postgresql stored-procedures functions

我在PostgreSQL 教程上读到了这篇文章:

如果您想从存储过程返回值,可以使用输出参数。输出参数的最终值将返回给调用者。

然后我发现DZone的函数和存储过程之间存在差异:

存储过程不返回值,但存储函数返回单个值

谁能帮我解决这个问题。

如果我们可以从存储过程中返回任何内容,也请让我知道如何从SELECT主体内的语句中执行此操作。

如果我有错的地方请告知。

Erw*_*ter 13

你们的两个消息来源都是完全错误的

  • AFUNCTION基本上总是返回一些东西。void至少是单个值、一行或一组行(“集合返回函数”,又名“表函数”)——唯一不能返回任何内容(即不返回行)的变体。从 PL/pgSQL 代码中调用,如果您不想要结果,则必须主动忽略结果。看:

  • 如果A (Postgres 11 或更高版本)具有任何带有模式(或自 Postgres 14 以来的模式)的PROCEDURE参数,则返回单行。zsheep 提供了一个例子INOUTOUT

考虑一个DO语句来运行临时 PL/pgSQL 代码而不传递或返回任何内容。

解决你的核心问题:

如果我们可以从存储过程中返回任何内容,也请让我知道如何从SELECT主体内的语句中执行此操作。

与函数中的方式相同。
PL/pgSQLINTO过程中,使用关键字分配给参数:

CREATE PROCEDURE assign_demo(INOUT _val text DEFAULT null)
  LANGUAGE plpgsql AS
$proc$
BEGIN
   SELECT val FROM tbl WHERE id = 2
   INTO _val;                              -- !!!
END
$proc$;
Run Code Online (Sandbox Code Playgroud)

SQL 过程中,最后一个命令返回值决定返回值:

CREATE PROCEDURE lang_sql_demo(INOUT _val text DEFAULT null)
  LANGUAGE sql AS
$proc$
SELECT val FROM tbl WHERE id = 2;
$proc$;
Run Code Online (Sandbox Code Playgroud)

标准 SQL 过程类似:

CREATE OR REPLACE PROCEDURE lang_std_sql_demo(INOUT _val text DEFAULT null)
  LANGUAGE sql
BEGIN ATOMIC
SELECT val FROM tbl WHERE id = 2;
END;
Run Code Online (Sandbox Code Playgroud)

看:

db<>在这里摆弄

有关的:


小智 11

过程是 Postgresql 11 版本中的一个新事物,过程和函数之间有两个很大的区别

一个过程可以发出提交或回滚并继续处理,而函数不能发出提交或回滚。

函数创建隐式事务,发生任何异常都会导致回滚,除非有异常块

过程可以通过 INOUT 参数返回一个值,请参阅创建函数如何工作

create procedure increase(inout i integer )
LANGUAGE 'plpgsql'
AS $$
begin
    i = i+1;
    return;
end ;
$$;

call increase(1);
Run Code Online (Sandbox Code Playgroud)

第二个最大的区别是

select increase () -- fails with an error 
-- must use CALL to use a procedure
call increase (3) ;
Run Code Online (Sandbox Code Playgroud)

除非需要提交或回滚使用Functions,否则还有更多调用和返回值的功能...