技术干货|Kingbase ES在函数中如何返回多个结果集?
很多数据库支持通过函数或存储过程返回多个结果集,比如:
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中函数如何返回多个结果集:
数据准备工作
Ⅰ
创建测试表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;
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
相关文章