pgsql函数中的return类型

在pgsql函数中有三个类返回类型,分别是 RETURNS expressionRETURNS SETOF sometypeRETURNS RECORD

RETURNS expression类型返回的是一个标量类型或者一个复合类型,标量类型类似与int等,复合类型类似rowtype其中rowtype类型的返回实例如下:

首先创建一个表test1,表中定义两个列id以及info

postgres=# create table test1(id int,info text);

向表中插入两行数据:

postgres=# insert into test1 values(1,'a'),(2,'b');
INSERT 0 2
postgres=# select * from test1;
 id | info
----+------
  1 | a
  2 | b
(2 rows)

如果想用function查询表中对应id的info可以创建下面的函数:

create or replace function find_info(id_in int) returns text
as $$
declare
info_out test1%rowtype;   --info_out为test1的行类型
begin
select * from test1 where id = id_in into info_out;
return info_out.info;
end;
$$ language plpgsql;

指定查询:

postgres=# select find_info(2);
 find_info
-----------
 b
(1 row)

可以看出在find_info函数中的返回类型为text,所以在函数的块中返回也必须为text,这里返回的是info_out.info对应表test1中的info类型。

返回一个记录(RECORD),记录相当于行类型变量,但是没有预定义的结构,所以返回的记录可以代替指定的rowtype类型,代码如下:

create or replace function test4() returns test1 --注意这里的test1是一个表的定义类型
as $$
declare
var record;          --声明一个记录
begin
select * from test1 into var;
return var;
end;
$$ language plpgsql;

在上面代码中,returns声明的是一个表test1类型,但是返回的是一个记录,说明记录可以用于代替rowtype类型。

如果声明中retures record,在查找命令中可以给查找的记录重命名,只有record才能重命名:

create or replace function test12(int) returns record
as $$
declare
var record; 
myid alias for $1;  --使用函数参数时最好给参数声明alias for
begin
select * from test1 where id=myid into var;
return var;
end;
$$ language plpgsql;

使用查询结果如下:

select * from test12(1) as(myid int, myinfo text);
 myid | myinfo
------+--------
    1 | a
(1 row)

但是使用select * from test12(1);会报错。

RETURN NEXT

通常return next返回的是一个结果集(setof sometype),return next多应用与循环语句中,在循环语句中将返回的结果存储并累加,结果集最终被建立起来。示例如下:

create or replace function test0() returns setof test1
as $$
declare
var record;
t_sql text:='select * from test1';
begin
for var in execute t_sql loop   --execute执行动态命令
return next var;
end loop;
end;
$$ language plpgsql;

最终的结果为:
 

postgres=# select test0();
 test0
-------
 (1,a)
 (2,b)
(2 rows)

 

  • 3
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
PostgreSQL,可以使用自定义的IF函数来实现类似于MySQLIF函数的功能。IF函数的语法如下: ```sql CREATE OR REPLACE FUNCTION if(bln boolean, inValue1 anyelement, inValue2 anyelement) RETURNS anyelement AS $$ BEGIN IF bln = true THEN RETURN inValue1; ELSE RETURN inValue2; END IF; END; $$ LANGUAGE plpgsql; ``` 这个函数接受三个参数:一个布尔值(expr1),一个任意类型的值(expr2),和另一个任意类型的值(expr3)。如果布尔值为true,则返回expr2的值;如果布尔值为false,则返回expr3的值。 你可以根据需要在函数定义不同类型的参数和返回值。例如,你可以创建一个返回numeric类型的IF函数: ```sql CREATE OR REPLACE FUNCTION if(bln boolean, inValue1 numeric, inValue2 numeric) RETURNS numeric AS $$ BEGIN IF bln = true THEN RETURN inValue1; ELSE RETURN inValue2; END IF; END; $$ LANGUAGE plpgsql; ``` 你还可以创建一个返回text类型的IF函数: ```sql CREATE OR REPLACE FUNCTION if(bln boolean, inValue1 numeric, inValue2 text) RETURNS text AS $$ BEGIN IF bln = true THEN RETURN inValue1; ELSE RETURN inValue2; END IF; END; $$ LANGUAGE plpgsql; ``` 通过创建这些自定义的IF函数,你可以在PostgreSQL实现类似于MySQLIF函数的功能。 #### 引用[.reference_title] - *1* [postgresql兼容MySQL if函数](https://blog.csdn.net/qq_32935175/article/details/111642194)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [pgsql -- if判断](https://blog.csdn.net/expect521/article/details/104826705)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值