HSQLDB中如何传递声明表至存储过程及获取其他过程结果游标?
HSQLDB是否支持传递声明表作为存储过程参数及跨存储过程获取结果游标?
核心结论
HSQLDB目前不支持你提到的两种原生操作:无法直接将局部声明表(DECLARE TABLE定义的对象)作为参数传递给存储过程,也不能直接在SELECT语句中嵌套调用返回游标的存储过程来获取其结果。不过可以通过替代方案实现类似需求。
1. 传递临时表到存储过程的替代方案
HSQLDB的局部声明表是存储过程内部的局部对象,无法跨存储过程引用。可以改用全局临时表来实现数据传递:
- 先创建全局临时表(定义持久化,数据会话隔离):
CREATE GLOBAL TEMPORARY TABLE temp_table (id int, quantity int) ON COMMIT DELETE ROWS;
- 修改存储过程,通过全局临时表共享数据,无需传递表参数:
CREATE PROCEDURE calculate_something_1(in data int) MODIFIES SQL DATA DYNAMIC RESULT SETS 1 BEGIN ATOMIC INSERT INTO temp_table VALUES (1, 10), (2, 20), (3, 30); DECLARE result_cursor CURSOR FOR SELECT id FROM (CALL calculate_something_2()) WHERE id > 10; OPEN result_cursor; END; CREATE PROCEDURE calculate_something_2() MODIFIES SQL DATA DYNAMIC RESULT SETS 1 BEGIN ATOMIC DECLARE result_cursor CURSOR FOR SELECT id FROM temp_table WHERE id > 5; OPEN result_cursor; END;
2. 跨存储过程获取结果的替代方案
HSQLDB不支持SELECT ... FROM (CALL proc())这种嵌套调用返回游标的存储过程的语法,推荐改用表函数替代返回游标的存储过程,这样可以直接在SELECT中引用:
-- 将原存储过程改为表函数 CREATE FUNCTION calculate_something_2() RETURNS TABLE(id int) READS SQL DATA BEGIN ATOMIC RETURN SELECT id FROM temp_table WHERE id > 5; END; -- 调用方存储过程直接查询表函数结果 CREATE PROCEDURE calculate_something_1(in data int) MODIFIES SQL DATA DYNAMIC RESULT SETS 1 BEGIN ATOMIC INSERT INTO temp_table VALUES (1, 10), (2, 20), (3, 30); DECLARE result_cursor CURSOR FOR SELECT id FROM calculate_something_2() WHERE id > 10; OPEN result_cursor; END;
如果必须使用存储过程,也可以让被调用的存储过程将结果写入临时表,再由调用方从临时表读取数据。
内容的提问来源于stack exchange,提问作者rapt
相关产品推荐
相关产品推荐

