绑定完请刷新页面
取消
刷新

分享好友

×
取消 复制
技术干货|Kingbase ES在函数中如何返回多个结果集?
2022-04-01 10:49:24

很多数据库支持通过函数或存储过程返回多个结果集,比如:

MSSQL:

CREATE PROCEDURE test 

AS

SELECT * FROM first_table

SELECT * FROM second_table


MYSQL:

CREATE PROCEDURE test_proc_multi_select()  

BEGIN  

    SELECT * FROM testproc;  

    SELECT * FROM testproc WHERE id=1;  

END; 


作为国产数据库领军品牌,Kingbase ES也支持返回多个结果集,并且有多种方式支持。由于Kingbase ES中存储过程不返回值,函数才能指定返回值(这也是Kingbase ES中函数与存储过程的主要区别),因此,要返回多个结果集需要通过函数来返回。


下面以返回两张表的数据为例,详细讲解Kingbase ES中函数如何返回多个结果集:

 1

数据准备工作

创建测试表FIRST_TABLE

CREATE TABLE FIRST_TABLE(ID INT PRIMARY KEY, INFO TEXT, CRT_TIME TIMESTAMP);


INSERT INTO FIRST_TABLE SELECT GENERATE_SERIES(1,4),                 MD5(RANDOM()::TEXT),CLOCK_TIMESTAMP();


SELECT * FROM FIRST_TABLE;


创建测试表SECOND_TABLE

CREATE TABLE SECOND_TABLE(ID INT PRIMARY KEY, INFO TEXT, CRT_TIME TIMESTAMP);


INSERT INTO SECOND_TABLE SELECT    GENERATE_SERIES(6,8),MD5(RANDOM()::TEXT),

CLOCK_TIMESTAMP();


SELECT * FROM SECOND_TABLE;

2

KingbaseES中函数返回多个结果集的方式

指定函数返回类型为SETOF

\set SQLTERM /

CREATE OR REPLACE FUNCTION TEST_FUNC_1() 

  RETURNS SETOF FIRST_TABLE

AS 

BEGIN

  RETURN QUERY SELECT * FROM FIRST_TABLE;

  RETURN QUERY SELECT * FROM SECOND_TABLE;

END;

/

SELECT * FROM TEST_FUNC_1();

/


指定函数返回类型为表

\set SQLTERM /

CREATE OR REPLACE FUNCTION TEST_FUNC_2() 

  RETURNS TABLE(ID_NEW INT, INFO_NEW TEXT, CRT_TIME TIMESTAMP)

AS

BEGIN

  RETURN QUERY SELECT * FROM FIRST_TABLE;

  RETURN QUERY SELECT * FROM SECOND_TABLE;

END;

/

SELECT * FROM TEST_FUNC_2();


其中还可以返回表中某些字段,如:

\set SQLTERM /

CREATE OR REPLACE FUNCTION TEST_FUNC_2_1() 

  RETURNS TABLE(ID_NEW INT, INFO_NEW TEXT)

AS

BEGIN

  RETURN QUERY SELECT ID, INFO FROM FIRST_TABLE;

  RETURN QUERY SELECT ID, INFO FROM SECOND_TABLE;

END;

/

SELECT * FROM TEST_FUNC_2_1();

/


指定函数返回类型为refcursor

\set SQLTERM /

CREATE OR REPLACE FUNCTION REF_FUNC(REFCURSOR) RETURNS REFCURSOR AS

BEGIN

    OPEN $1 FOR SELECT * FROM FIRST_TABLE UNION SELECT * FROM SECOND_TABLE;

    RETURN $1;

END;

/


\set SQLTERM ;

BEGIN;

SELECT REF_FUNC('FUNCCURSOR');

FETCH ALL IN FUNCCURSOR;

COMMIT;



总的来说,上述三种方法各有特点,都能达到返回多个结果集的作用。在实际应用中,大家只需选择适合自己的方法即可。


来自:https://mp.weixin.qq.com/s/cyQdciXQt7slPpydTTLmqQ

分享好友

分享这个小栈给你的朋友们,一起进步吧。

Kingbase
创建时间:2022-04-01 10:36:25
Kingbase
展开
订阅须知

• 所有用户可根据关注领域订阅专区或所有专区

• 付费订阅:虚拟交易,一经交易不退款;若特殊情况,可3日内客服咨询

• 专区发布评论属默认订阅所评论专区(除付费小栈外)

技术专家

查看更多
  • gaokeke123
    专家
戳我,来吐槽~