很多数据库支持通过函数或存储过程返回多个结果集,比如:
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.数据准备工作

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;
技术干货|Kingbase ES在函数中如何返回多个结果集?

2)创建测试表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;

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

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

1)通过指定函数返回类型为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();
/
技术干货|Kingbase ES在函数中如何返回多个结果集?

2)通过指定函数返回类型为表返回多个结果集

\set SQLTERM /
\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();
/

技术干货|Kingbase ES在函数中如何返回多个结果集?
其中还可以返回表中某些字段,如:

\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();
/
技术干货|Kingbase ES在函数中如何返回多个结果集?

3)通过指定函数返回类型为refcursor返回多个结果集

\setSET 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;
/

\setSET SQLTERM ;
BEGIN;
SELECT REF_FUNC(‘FUNCCURSOR’);
FETCH ALL IN FUNCCURSOR;
COMMIT;
技术干货|Kingbase ES在函数中如何返回多个结果集?

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

相关文章: