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

ORA-00997错误排查:SQL Server2012数据迁移至Oracle19c失败

解决ORA-00997: illegal use of LONG datatype 错误

这个问题的根源在于SQL Server的nvarchar(-1)(实际对应SQL Server的nvarchar(max))被Oracle网关识别成了Oracle的LONG数据类型,而Oracle对LONG类型有诸多严格限制——比如不能直接在INSERT...SELECT或者CREATE TABLE AS SELECT这类语句中使用,这就是你触发错误的核心原因。

下面给你几个可行的解决方案:

1. 显式转换数据类型(优先推荐)

既然Oracle目标表的ADDRESS字段是VARCHAR2(2000),你可以在查询时把SQL Server端的ADDRESS字段显式转换成VARCHAR2(2000),绕过LONG类型的限制:

针对INSERT语句:

INSERT INTO ADDRESS (ID,ADDRESS,REMARK) 
SELECT "ID", CAST("ADDRESS" AS VARCHAR2(2000)), "REMARK" 
FROM ADDRESS@MSSQL;

针对CREATE TABLE AS SELECT语句:

CREATE TABLE test AS 
SELECT id, CAST(address AS VARCHAR2(2000)) AS address, remark 
FROM address@MSSQL;

⚠️ 注意:执行前请先确认SQL Server中ADDRESS字段的实际最大长度不超过2000字符,如果有超过的内容,CAST操作会触发截断错误。这种情况下你有两个选择:

  • 如果可以接受截断,结合SUBSTRING使用:CAST(SUBSTRING("ADDRESS", 1, 2000) AS VARCHAR2(2000))
  • 如果需要保留完整内容,修改Oracle目标表的ADDRESS字段为CLOB,然后转换为CLOB类型:CAST("ADDRESS" AS CLOB)

2. 调整网关数据类型映射(进阶方案)

如果显式转换不能满足需求,你可以检查Oracle网关的配置文件(比如initMSSQL.ora),尝试调整SQL Server数据类型到Oracle的映射规则。例如可以添加或修改以下参数:

  • HS_FDS_REMOTE_DB_CHARSET = UTF-8:确保字符集匹配,减少类型映射偏差
  • HS_FDS_SUPPORT_STATISTICS = FALSE:关闭统计信息支持,避免网关对大字段的特殊处理

不过这种方法需要对Oracle网关配置有一定了解,建议优先测试显式转换的方案。

内容的提问来源于stack exchange,提问作者Marco Tsang

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 13:32:45