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
相关产品推荐
相关产品推荐

