PostgreSQL 函数返回参数定义以及返回多个参数解决方案

PostgreSQL动态SQL解决函数返回类型变更问题

在使用PostgreSQL 写函数过程的时候会存在一个问题那就是定义函数的参数及sql查询返回TABLE数据时比较麻烦

1. 先看如下函数定义了入参reqname,reqage和返回的表字段name,age

CREATE OR REPLACE FUNCTION "public"."creat_table_test"("reqname" varchar, "reqage" varchar)
  RETURNS TABLE("name" varchar,  "age" int4) AS $BODY$
DECLARE 
vsql varchar(1000);
BEGIN
		vsql:= ' SELECT cast ('''' as VARCHAR) as name, 3 as int';
	raise notice 'query sql:%',vsql;
  RETURN  QUERY execute vsql;		
	RETURN;		
END
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100
  ROWS 1000

如果有需求需要加一个表字段返回:地址 address

CREATE OR REPLACE FUNCTION "public"."creat_table_test"("reqname" varchar, "reqage" varchar)
  RETURNS TABLE("name" varchar,  "age" int4,"address" VARCHAR) AS $BODY$
DECLARE 
vsql varchar(1000);
BEGIN
		vsql:= ' SELECT cast ('''' as VARCHAR) as name, 3 as int';
	raise notice 'query sql:%',vsql;
  RETURN  QUERY execute vsql;		
	RETURN;		
END
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100
  ROWS 1000

此时有个不友好的提示出现了:

> ERROR:  cannot change return type of existing function
DETAIL:  Row type defined by OUT parameters is different.
HINT:  Use DROP FUNCTION creat_table_test(character varying,character varying) first

不能更改函数定义好的返回类型,需要先DROP该函数才能创建。如果需求时刻变化又增加返回比如电话、学历、性别等,那就需要反复创建函数了。

那么有没有一劳永逸的办法,只创建一次函数,后续无论增加多少字段返回都无需先DROP再创建

答案是有的,且看下面解决的一个办法:

CREATE OR REPLACE FUNCTION "public"."creat_table_test"("reqname" varchar, "reqage" varchar)
 RETURNS TABLE("id" varchar,  "tabledata" text) AS $BODY$
DECLARE 
vsql varchar(1000);
BEGIN
		vsql:= ' SELECT cast (''1'' as VARCHAR) as id, 	(select cast(jsondata as text) as jsondata from (select json_agg(row_to_json(tbres)) as jsondata from 			
							(
									-- sql  start
									
									SELECT 3 as age,
									''liming'' as name,
									''北京''  as address
									-- sql  end
									
									) as tbres
				)  as tmp_tbdata ) as tabledata';
	raise notice 'query sql:%',vsql;
  RETURN  QUERY execute vsql;		
	RETURN;		
END
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100
  ROWS 1000

这样无论需要返回多少字段的信息,只需要在sql  start 和sql  end之间写需要查询的sql业务逻辑即可,这样就方便了很多。

查询结果:

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值