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

Oracle通过DG4ODBC连MySQL DBLINK后SQL Developer等报ORA-00600错误

错误原因

这个ORA-00600 [HO define: Long fetch] 是Oracle异构网关DG4ODBC的经典兼容问题,根因是网关对MySQL变长字符字段的元数据映射和Oracle客户端的行预取机制冲突:

  • SQL*Plus默认预取行数仅为2,且不会对大长度字符串做提前内存分配,因此不会触发阈值;
  • SQL Developer、cx_Oracle等客户端默认开启了更高的预取行数(通常为50~100),当查询返回多列变长字符串时,Oracle异构服务层计算的预估行宽超过内部限制,就会触发这个内部错误。
    部分场景下也和MySQL ODBC驱动默认将超长varchar映射为Oracle LONG类型、网关字符集不匹配有关。

修复方案

  • 1. 调整DG4ODBC网关配置
    编辑网关对应的初始化配置文件$ORACLE_HOME/hs/admin/init<网关SID>.ora,新增以下参数:
    HS_RPC_FETCH_SIZE = 65535
    HS_LANGUAGE = AMERICAN_AMERICA.AL32UTF8
    HS_NLS_NCHAR = AL32UTF8
    HS_LONG_PIECE_TRANSFER = TRUE
    
    修改完成后重启网关监听生效。
  • 2. 调整MySQL ODBC驱动配置
    编辑odbc.ini配置文件(Windows平台则打开ODBC数据源管理器修改对应数据源属性):
    • 新增配置项NO_CACHE=1,关闭前向游标结果缓存
    • 新增配置项MAX_VARCHAR_SIZE=4000(Oracle开启32K varchar可设为32767),避免varchar字段被误识别为LONG类型
  • 3. 客户端参数适配
    • cx_Oracle连接时手动调低预取参数:
      import cx_Oracle
      conn = cx_Oracle.connect("用户名/密码@TNS名称")
      conn.prefetchrows = 10
      conn.prefetchmemory = 0
      
    • SQL Developer在「工具 -> 首选项 -> 数据库 -> 高级」中,将「SQL预取计数」调整为10,取消勾选「预取LOB列」
  • 4. 临时查询规避
    不需要改配置的场景下,查询时对所有MySQL侧的变长字符串字段加显式类型转换即可:
    select 
      ID,
      HARDWARE_ID,
      cast("MANUFACTURER" as varchar2(255)) "MANUFACTURER",
      cast("NAME" as varchar2(255)) "NAME",
      cast("DESCRIPTION" as varchar2(255)) "DESCRIPTION"
    from "ocsweb"."sounds"@myodbc5;
    

内容的提问来源于stack exchange,提问作者Srikanth Lingala

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 18:18:02