存储过程 RETURN语句

 

1、RETURN

如果没有使用表达式,RETURN 命令用于告诉这个函数已经完成执行了,如示例2.

如果返回标量类型,那么可以使用任何表达式。 

示例1: 带有表达式return

1
2
3
4
5
6
7
8
9
10
11
CREATE OR REPLACE FUNCTION getCompFoo1(in_col1 int, in_col2 TEXT)
RETURNS compfoo
AS $$
DECLARE
    comp compfoo;
BEGIN
    comp.f1 := in_col1 + 1;
    comp.f2 := in_col2 || '_result';
    RETURN comp;
END;
$$ LANGUAGE PLPGSQL;

compfoo 为自定义类型:CREATE TYPE compfoo AS (f1 int, f2 text); 

函数返回结果:

1
2
3
4
5
test=# select getCompFoo1(1,'a');                                                                            
 getcompfoo1 
--------------
 (2,a_result)
(1 row)

如果声明函数带输出参数,那么就只需要写无表达式的RETURN。那么输出参数变量的当前值将被返回。

1
2
3
4
5
6
7
CREATE OR REPLACE FUNCTION getCompFoo2 (in_col1 IN int,in_col2 IN TEXT, out_col1 OUT int, out_col2 OUT TEXT)
AS $$
BEGIN
    out_col1 := in_col1 + 1;
    out_col2 := in_col2 || '_result';
END;
$$ LANGUAGE PLPGSQL;

函数返回结果:

1
2
3
4
5
test=# select getCompFoo2(1,'a');
 getcompfoo2 
--------------
 (2,a_result)
(1 row)

示例2:不带有表达式return

如果声明函数返回void,那么一个RETURN语句可以用于提前退出函数; 但是不要在RETURN后面写一个表达式。 

1
2
3
4
5
6
7
8
9
10
11
CREATE OR REPLACE FUNCTION getreturn(in_col1 int)
RETURNS void
AS $$
BEGIN
    if in_col1 > 0 then
      RAISE NOTICE 'there is %',in_col1;
    else
      return;
    end if;
END;
$$ LANGUAGE PLPGSQL;

函数返回结果:

1
2
3
4
5
6
7
8
9
10
11
12
test=# select getreturn(1);
NOTICE:  there is 1
 getreturn
-----------
  
(1 row)
 
test=# select getreturn(0);
 getreturn
-----------
  
(1 row)

 

2、RETURN NEXT 

可以用于标量和复合数据类型;对于复合类型,将返回一个完整的结果"table"。

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
CREATE TABLE foo (fooid INT, foosubid INT, fooname TEXT);
INSERT INTO foo VALUES (1, 2, 'three');
INSERT INTO foo VALUES (4, 5, 'six');
 
CREATE OR REPLACE FUNCTION getAllFoo() RETURNS SETOF foo AS
$$
DECLARE
    r foo%rowtype;
BEGIN
    FOR r IN SELECT * FROM foo WHERE fooid > 0
    LOOP
        -- can do some processing here
        RETURN NEXT r; -- return current row of SELECT
    END LOOP;
    RETURN;
END
$$ LANGUAGE PLPGSQL;

返回结果:

1
2
3
4
5
6
test=# select getAllFoo();
  getallfoo 
-------------
 (1,2,three)
 (4,5,six)
(2 rows)

 

3、RETURN QUERY 

语法:

RETURN QUERY query;

RETURN QUERY EXECUTE command-string [ USING expression [, ... ] ];

 示例1:将一条查询的结果追加到一个函数的结果集中。

1
2
3
4
5
6
7
8
CREATE OR REPLACE FUNCTION getAllFoo2() RETURNS SETOF foo AS
$$
DECLARE
    r foo%rowtype;
BEGIN
    RETURN QUERY SELECT * FROM foo WHERE fooid > 0;
END
$$ LANGUAGE PLPGSQL;

返回结果:

1
2
3
4
5
6
test=# select getAllFoo2();
 getallfoo2 
-------------
 (1,2,three)
 (4,5,six)
(2 rows)

示例2:执行动态SQL。

1
2
3
4
5
6
CREATE OR REPLACE FUNCTION getAllFoo3(filter numeric) RETURNS SETOF foo AS
$$
BEGIN
    RETURN QUERY EXECUTE 'SELECT * FROM foo WHERE fooid > $1'  USING filter;
END
$$ LANGUAGE PLPGSQL;

执行结果:

1
2
3
4
5
test=# select getAllFoo3(1);
 getallfoo3
------------
 (4,5,six)
(1 row)

  

posted @   KINGBASE研究院  阅读(193)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
历史上的今天:
2022-01-12 KingbaseES V8R6 集群运维系列 -- 读写分离集群修改ssh端口
2022-01-12 Kingbase V8R6 集群运维系列 -- 在线删除standby节点
点击右上角即可分享
微信分享提示