我在PostgreSQL教程上读到这篇文章:
如果要从存储过程返回值,则可以使用输出参数。输出参数的最终值将返回给调用方。
然后,我在DZone中发现了函数和存储过程之间的区别:
存储过程不返回值,但存储函数返回单个值。
有人能帮我解决这个问题吗。
如果我们可以从存储过程返回任何内容,也请让我知道如何从正文中的SELECT
语句中返回。
如果我哪里错了,请通知我。
发布于 2020-07-19 22:26:51
您的两个源都是plain错误的。
void
的最小值、单个值、一行或一组行(“设置返回函数”,即a.k.a )。(“表-函数”)--唯一不能返回任何内容的变体,即不返回行。从PL/pgSQL代码中调用,如果不想要结果,就必须主动拒绝它们。请参阅:INOUT
模式(或自Postgres 14中以来的OUT
模式)的任何参数,则返回一行。提供了一个例子。考虑一个做语句来运行ad/pgSQL代码,而不传递或返回任何内容。
为了解决你的核心问题:
如果我们可以从存储过程返回任何内容,也请让我知道如何从正文中的
SELECT
语句中返回。
与功能相同的方式。在PL/pgSQL过程中,使用INTO
关键字为参数赋值:
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$;
在SQL过程中,最后一个命令返回值确定返回值:
CREATE PROCEDURE lang_sql_demo(INOUT _val text DEFAULT null)
LANGUAGE sql AS
$proc$
SELECT val FROM tbl WHERE id = 2;
$proc$;
类似于标准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;
请参见:
db<>fiddle 这里
相关信息:
发布于 2020-01-16 19:41:42
在Postgresql版本11中,过程是一个新事物,过程和函数之间有两个很大的区别
一个过程可以发出提交或回滚并继续处理,函数不能发出提交或回滚。
函数创建隐式事务任何发生的异常都会导致回滚,除非存在异常块。
过程可以通过INOUT参数返回值参见创建函数如何工作
create procedure increase(inout i integer )
LANGUAGE 'plpgsql'
AS $
begin
i = i+1;
return;
end ;
$;
call increase(1);
第二大区别是
select increase () -- fails with an error
-- must use CALL to use a procedure
call increase (3) ;
除非需要提交或回滚使用函数,否则有更多用于调用和返回值的特性.
https://dba.stackexchange.com/questions/257596
复制相似问题