Postgres存储过程:如何使用out参数返回多条记录?

Posted

技术标签:

【中文标题】Postgres存储过程:如何使用out参数返回多条记录?【英文标题】:Postgres Stored Procedures: how to return both multiple records with an out parameter? 【发布时间】:2016-08-24 09:59:39 【问题描述】:

我在 Postgres 9.4 中有一个类似于这个的函数:

CREATE OR REPLACE FUNCTION myF(
  INOUT _p1 character varying,
  IN _p2 integer,
  OUT _p3 boolean) 
RETURNS setof retVal AS 
$BODY$
  _p3 := '0';
  RETURN query SELECT 1 AS col1, 'test' as col2;
END;$BODY$
LANGUAGE plpgsql VOLATILE NOT LEAKPROOF
COST 100;

还定义了 retVal 类型:

create type retVal as (col1 int, col2 character varying);

函数的主体要复杂得多(为此我需要 plpgsql),我必须通过一个 Java 程序调用它

CallableStatement.executeQuery()

我的问题是: 1) 我应该在函数中输入什么作为 RETURNS 值? 2)通过RETURN查询语法返回结果是否正确?

非常感谢!

【问题讨论】:

【参考方案1】:

不可能 - 函数可以返回标量或记录或标量集或记录集。仅此而已。

可以将一组记录转换为记录数组,然后当一个字段是记录数组时可以返回一条记录:

CREATE TYPE footype AS (a int, b int);

CREATE OR REPLACE FUNCTION public.foo(OUT x integer, OUT y footype[])
 RETURNS record
 LANGUAGE plpgsql
AS $function$
BEGIN
  x := 10;
  SELECT ARRAY(SELECT (i, i+1)::footype FROM generate_series(1,10) g(i)) INTO y;
  RETURN;
END;
$function$

postgres=# SELECT * FROM foo();
┌────┬──────────────────────────────────────────────────────────────────────────────────────┐
│ x  │                                          y                                           │
╞════╪══════════════════════════════════════════════════════════════════════════════════════╡
│ 10 │ "(1,2)","(2,3)","(3,4)","(4,5)","(5,6)","(6,7)","(7,8)","(8,9)","(9,10)","(10,11)" │
└────┴──────────────────────────────────────────────────────────────────────────────────────┘
(1 row)

【讨论】:

以上是关于Postgres存储过程:如何使用out参数返回多条记录?的主要内容,如果未能解决你的问题,请参考以下文章

MySQL存储过程返回多个值

db2 - 如何在shell中获取存储过程OUT型参数的返回值(awk)

db2 - 如何在shell中获取存储过程OUT型参数的返回值(awk)

使用JPA调用存储过程,返回存储多行数据的OUT参数(游标)

Java 和 PostgreSQL 存储过程 - 返回注册为 out 参数,导致 in 参数出现问题

创建存储过程 in,out,inout