文档首页/
数据库和应用迁移 UGO/
用户指南/
语法转换指南/
转换错误码/
Oracle To GaussDB 转换错误码/
U0100082:GaussDB不支持 DBMS_SQL.GET_NEXT_RESULT 函数
更新时间:2025-10-22 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;
end ;
/
改造建议
直接注释掉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;
END;
/