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

U0100081:GaussDB不支持 DBMS_SQL.TO_REFCURSOR 函数

描述

Oracle:DBMS_SQL.TO_REFCURSOR 用于将 DBMS_SQL 游标 ID 转换为 REF CURSOR。

GaussDB:不支持DBMS_SQL.TO_REFCURSOR。

数据库类型与版本

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

语法示例

CREATE OR REPLACE PROCEDURE DBMS_SQL_TO_REFCURSOR AS l_cursor_id INTEGER;
l_ref_cursor SYS_REFCURSOR;
l_id NUMBER;
l_name VARCHAR2 (100);
l_return INTEGER;
BEGIN
-- 打开 DBMS_SQL 游标
  l_cursor_id := DBMS_SQL.OPEN_CURSOR;
-- 解析 SQL 语句
  DBMS_SQL.PARSE (l_cursor_id, 'SELECT id, name FROM test_table', DBMS_SQL.NATIVE);
-- 执行查询
  l_return := DBMS_SQL.EXECUTE (l_cursor_id);
-- 将 DBMS_SQL 游标转换为 REF CURSOR
  l_ref_cursor := DBMS_SQL.TO_REFCURSOR (l_return);
-- 使用 REF CURSOR 处理结果集
  LOOP
  FETCH l_ref_cursor INTO l_id,
  l_name;
  EXIT 
  WHEN l_ref_cursor % NOTFOUND;
  DBMS_OUTPUT.PUT_LINE ('ID: ' || l_id || ', NAME: ' || l_name);
END LOOP;
-- 关闭 REF CURSOR
CLOSE l_ref_cursor;
END;
/

改造建议

GaussDB 不支持 DBMS_SQL.TO_REFCURSOR 函数,将DBMS_SQL.TO_REFCURSOR改写为open cursor for ...。

create or replace procedure DBMS_SQL_TO_REFCURSOR as
    l_cursor_id  NUMBER(38);
    l_ref_cursor SYS_REFCURSOR;
    l_id         NUMBER;
    l_name       VARCHAR2(100);
    l_return     NUMBER(38);       
BEGIN
    -- 打开 DBMS_SQL 游标
    --  l_cursor_id := DBE_SQL.REGISTER_CONTEXT();
    -- 解析 SQL 语句
    -- DBE_SQL.SQL_SET_SQL(l_cursor_id, 'SELECT id, name FROM test_table', 2);
    -- 将 DBMS_SQL 游标转换为 REF CURSOR
    --l_ref_cursor := DBMS_SQL.TO_REFCURSOR(l_return);
    -- 使用 REF CURSOR 处理结果集
open l_ref_cursor for SELECT id, name FROM test_table; 
    LOOP
        FETCH l_ref_cursor INTO l_id, l_name;
        EXIT WHEN l_ref_cursor%NOTFOUND;
        DBE_OUTPUT.PRINT_LINE('ID: ' || l_id || ', NAME: ' || l_name);
    END LOOP;
    -- 关闭 REF CURSOR
    CLOSE l_ref_cursor;
END;
/