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,否则还有更多调用和返回值的功能...
| 归档时间: |
|
| 查看次数: |
69161 次 |
| 最近记录: |