更新时间:2026-03-19 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;       
    l_return     INTEGER;        
    l_id         NUMBER;          
    l_name       VARCHAR2(100); 
BEGIN
    l_cursor_id := DBMS_SQL.OPEN_CURSOR;
    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);
    l_return     NUMBER(38);  
    l_id         NUMBER; 
    l_name       VARCHAR2(100);  
BEGIN
    l_cursor_id := DBE_SQL.REGISTER_CONTEXT();
      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;
/

相关文档