更新时间:2025-06-04 GMT+08:00
分享

U0100082:GaussDB不支持 DBMS_SQL.GET_NEXT_RESULT 函数

描述

Oracle:DBMS_SQL.GET_NEXT_RESULT介绍:处理动态 SQL 查询返回的多个结果集 , 用于从递归语句中获取下一个返回的结果集。

GaussDB:不支持DBMS_SQL.GET_NEXT_RESULT。

数据库类型与版本

  • 源库类型与版本:UGO 支持的 Oracle 版本。
  • 目标库类型与版本:UGO 支持的 GaussDB 版本。

语法示例

create or replace procedure DBMS_SQL_GET_NEXT_RESULT as
DECLARE
    l_cursor_id  INTEGER;          -- 游标 ID
    l_return     INTEGER;          -- 返回值
    l_id         NUMBER;           -- 存储 ID 列的值
    l_name       VARCHAR2(100);    -- 存储 NAME 列的值
BEGIN
    -- 打开游标
    l_cursor_id := DBMS_SQL.OPEN_CURSOR;
    -- 解析 SQL 语句(模拟多个结果集)
    DBMS_SQL.PARSE(
        l_cursor_id,
		 'SELECT id, name FROM test_table WHERE id <= 2 union all SELECT id, name FROM test_table WHERE id > 2' ,
        DBMS_SQL.NATIVE
    );
    -- 执行查询
    l_return := DBMS_SQL.EXECUTE(l_cursor_id);

    -- 获取并处理结果集
    LOOP
        BEGIN
            -- 获取下一个结果集
            DBMS_SQL.GET_NEXT_RESULT(l_cursor_id, l_return);
            -- 如果没有更多结果集,退出循环
            EXIT WHEN l_return = 0;
            -- 定义列(必须与查询的列匹配)
            DBMS_SQL.DEFINE_COLUMN(l_cursor_id, 1, l_id);
            DBMS_SQL.DEFINE_COLUMN(l_cursor_id, 2, l_name, 100);

            -- 提取并输出数据
            DBMS_OUTPUT.PUT_LINE('--- Result Set ---');
            LOOP
                -- 提取一行数据
                IF DBMS_SQL.FETCH_ROWS(l_cursor_id) > 0 THEN
                    -- 获取列值
                    DBMS_SQL.COLUMN_VALUE(l_cursor_id, 1, l_id);
                    DBMS_SQL.COLUMN_VALUE(l_cursor_id, 2, l_name);

                    -- 输出结果
                    DBMS_OUTPUT.PUT_LINE('ID: ' || l_id || ', NAME: ' || l_name);
                ELSE
                    EXIT; -- 退出当前结果集的提取
                END IF;
            END LOOP;
        EXCEPTION
            WHEN OTHERS THEN
                EXIT; -- 如果发生异常,退出循环
        END;
    END LOOP;
/

改造建议

直接注释掉DBMS_SQL.GET_NEXT_RESULT循环这部分逻辑。

GaussDB改写后为:

create or replace procedure DBMS_SQL_GET_NEXT_RESULT1() as
DECLARE
    l_cursor_id  NUMBER(38);          -- 游标 ID
    l_return     NUMBER(38);          -- 返回值
    l_id         NUMBER;           -- 存储 ID 列的值
    l_name       VARCHAR2(100);    -- 存储 NAME 列的值
BEGIN
    -- 打开游标
    l_cursor_id := DBE_SQL.REGISTER_CONTEXT();
    -- 解析 SQL 语句(模拟多个结果集)
    DBE_SQL.SQL_SET_SQL(
        l_cursor_id,
         'SELECT id, name FROM test_table WHERE id <= 2 union all SELECT id, name FROM test_table WHERE id > 2' ,
        2
    );
    -- 执行查询
    l_return := DBE_SQL.SQL_RUN(l_cursor_id);
    -- 获取并处理结果集
   LOOP
        BEGIN
            /*--获取下一个结果集
          DBE_SQL.RUN_AND_NEXT(l_cursor_id/*, l_return*/);
	 -- 执行查询
         l_return := DBE_SQL.SQL_RUN(l_cursor_id);
            --如果没有更多结果集,退出循环
           EXIT WHEN l_return = 0;*/
          -- 定义列(必须与查询的列匹配)
            DBE_SQL.SET_RESULT_TYPE(l_cursor_id, 1, l_id);
            DBE_SQL.SET_RESULT_TYPE(l_cursor_id, 2, l_name, 100);
            -- 提取并输出数据
            DBE_OUTPUT.PRINT_LINE('--- Result Set ---');
            LOOP
                -- 提取一行数据
                IF DBE_SQL.NEXT_ROW(l_cursor_id) > 0 THEN
                    -- 获取列值
                    DBE_SQL.GET_RESULTS(l_cursor_id, 1, l_id);
                    DBE_SQL.GET_RESULTS(l_cursor_id, 2, l_name);

                    -- 输出结果
                    DBE_OUTPUT.PRINT_LINE('ID: ' || l_id || ', NAME: ' || l_name);
                ELSE
                    EXIT; -- 退出当前结果集的提取
                END IF;
            END LOOP;
        EXCEPTION
            WHEN OTHERS THEN
                EXIT; -- 如果发生异常,退出循环
        END;
   END LOOP;
    -- 关闭游标
    DBE_SQL.SQL_UNREGISTER_CONTEXT(l_cursor_id);
END;
/

相关文档