如何从功能B

时间:2018-10-03 09:12:05

标签: sql postgresql plpgsql

我有两个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读取这两个返回值?

提前谢谢!

2 个答案:

答案 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 varyingvarchar相同。考虑使用它。

答案 1 :(得分:1)

您可以像之前提到的那样使用SELECT INTO-但是此语句设计用于非简单选择(具有FROM子句)。仅将SELECT INTO用于得出两个或多个out变量的结果会对功能产生影响。最好使用复合变量或记录变量并分配命令。只是:

DECLARE r record;
BEGIN
  r := B(r1, r2);
  RAISE NOTICE 'code: %, message: %', r.code, r.message;
  ...