lightdb新特性--兼容oracle--函数参数有多个out类型,return可以返回任意类型

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)
请使用浏览器的分享功能分享到微信等