我有两个postgres函数。函数A正在调用函数B,该函数返回2个varchar类型的记录。
功能A
CREATE OR REPLACE FUNCTION A(
IN r1 character varying,
IN r2 character varying,
OUT code character varying,
OUT msg character varying)
RETURNS record AS
$BODY$
BEGIN
perform function B(r1,r2);
END; $BODY$
LANGUAGE plpgsql VOLATILE
这样做
select * from function A ('r1', 'r2')
我没有列代码和味精。
运行功能A,功能B正常,并返回代码和消息。如何从函数A读取这两个返回值?
提前谢谢!
答案 0 :(得分:1)
当您执行PERFORM
时,您的SELECT
的结果将被丢弃,这不是我们想要的。
如果您使用OUT
参数声明了函数,则需要使用来填充它们的值
SELECT ... INTO ...
因此,方法是获取来自B
函数的值,然后将它们填充到输出参数中,例如:
SELECT * INTO code, msg FROM B(r1, r2);
这表示您的函数将如下所示:
CREATE OR REPLACE FUNCTION A(
IN r1 character varying,
IN r2 character varying,
OUT code character varying,
OUT msg character varying)
RETURNS record AS
$BODY$
BEGIN
SELECT * INTO code, msg FROM B(r1, r2);
END;
$BODY$
LANGUAGE plpgsql VOLATILE;
您应该这样称呼它:
SELECT * FROM A('first_arg', 'second_arg');
注意:
VOLATILE
是否是您真正需要的。取决于STABLE
功能码,您可能只需要B
就可以了。这可能会加快速度character varying
与varchar
相同。考虑使用它。答案 1 :(得分:1)
您可以像之前提到的那样使用SELECT INTO
-但是此语句设计用于非简单选择(具有FROM
子句)。仅将SELECT INTO
用于得出两个或多个out变量的结果会对功能产生影响。最好使用复合变量或记录变量并分配命令。只是:
DECLARE r record;
BEGIN
r := B(r1, r2);
RAISE NOTICE 'code: %, message: %', r.code, r.message;
...