技术干货|Kingbase ES在函数中如何返回多个结果集?

2022-04-01 00:00:00 函数 多个 专区 指定 返回

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

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

相关文章