You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

HSQLDB中如何传递声明表至存储过程及获取其他过程结果游标?

HSQLDB是否支持传递声明表作为存储过程参数及跨存储过程获取结果游标?

核心结论

HSQLDB目前不支持你提到的两种原生操作:无法直接将局部声明表(DECLARE TABLE定义的对象)作为参数传递给存储过程,也不能直接在SELECT语句中嵌套调用返回游标的存储过程来获取其结果。不过可以通过替代方案实现类似需求。


1. 传递临时表到存储过程的替代方案

HSQLDB的局部声明表是存储过程内部的局部对象,无法跨存储过程引用。可以改用全局临时表来实现数据传递:

  1. 先创建全局临时表(定义持久化,数据会话隔离):
CREATE GLOBAL TEMPORARY TABLE temp_table (id int, quantity int) ON COMMIT DELETE ROWS;
  1. 修改存储过程,通过全局临时表共享数据,无需传递表参数:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 14:55:18