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参数返回多条记录?的主要内容,如果未能解决你的问题,请参考以下文章
db2 - 如何在shell中获取存储过程OUT型参数的返回值(awk)
db2 - 如何在shell中获取存储过程OUT型参数的返回值(awk)
使用JPA调用存储过程,返回存储多行数据的OUT参数(游标)