plpgsql 中函数参数列表中如果多个 OUT,那么函数的
returns
值必须是 recored 类型,如果 returns 指定的是非 record,那么将会报错。
create or replace function func(x int, out y int, out z int)
returns int
as $$
declare
begin
y = 1;
z = 2;
return z;
end
$$
language plpgsql;
ERROR: function result type must be record because of OUT parameters
将上面的函数改为 oracle 的存储过程语法,是可以执行的。
plpgsql 中,对于有多个 OUT 参数的,在创建函数的时候如果函数签名没有指定
returns
,那么默认就是 record 类型。
在多个 OUT 参数的函数 block 中,可以不用写 return,最后默认返回 record。
CREATE OR REPLACE FUNCTION func(x int, OUT y int, OUT z int)
RETURNS record
LANGUAGE plpgsql
AS $$
declare
begin
y = 1;
z = 2;
-- 不指定 return,默认返回 reocrd
end
$$
postgres=# select * from func(1);
y | z
---+---
1 | 2
(1 row)
如果指定的返回类型不是 record,则会在创建的过程中报错。
create or replace function func(x int, out y int, out z int)
as $$
declare
begin
y = 1;
z = 2;
return z; -- 指定的返回类型不是record,则会在创建的过程中报错
end
$$
language plpgsql;
ERROR: RETURN cannot have a parameter in function with OUT parameters
LINE 7: return z;
^
lightdb的plorasql支持函数参数有多个out类型,return可以返回任意类型
-- 一个out参数,返回一个out参数
create or replace function func(x int, y out int, z out int) return int
as
begin
y = 1;
z = 2;
return z;
end;
/
select func(1);
func
------
2
(1 row)
-- 多个out参数,返回一个整型参数
create or replace function func(x int, y out int, z out int) return int
as
begin
y = 1;
z = 2;
return x;
end;
/
select func(666);
func
------
666
(1 row)
-- 多个out参数,返回一个局部变量
create or replace function func(x int, y out int, z out int) return int
as
rc int := 0;
begin
y = 1;
z = 2;
return rc;
end;
/
select func(1);
func
------
0
(1 row)
drop function func;
-- 多个out参数,返回一个record
create or replace function func(x int, y out int, z out int) return record
as
begin
y = 1;
z = 2;
end;
/
select func(1);
func
-------
(1,2)
(1 row)
drop function func;
-- 多个out参数,返回NULL
create or replace function func(x int, y out int, z out int) return void
as
begin
y = 1;
z = 2;
end;
/
select func(1);
func
------
(1 row)
drop function func;
create table test_for_return(id int, name text);
insert into test_for_return values(1, 'a'), (2, 'b'), (3, 'c');
-- 一个out参数,返回集合
CREATE OR REPLACE FUNCTION func(out rc text)
RETURN SETOF TEXT
AS
command text := 'select name from test_for_return';
BEGIN
FOR rc IN execute command LOOP
RETURN next;
END LOOP;
RETURN;
END;
/
select func();
func
------
a
b
c
(3 rows)