oracle迁移达梦常见错误

标度大于精度

达梦NUMBER类型为NUMBER(精度,标度),精度指数字的位数,标度指小数点后的位数,达梦要求精度必须大于等于标度。

解决方法:如Oracle:NUMBER(1,2) 改成DM:NUMBER(3,2)

语法分析出错
如/* 任务失败: 创建自定义类型TY_SOFT_WORK_EXPERT_OBJ */ 
/* 第 3 行, 第 3 列[SECTION]附近出现错误: 
语法分析出错 */

解决方法:这类问题可能是因为在创建自定义类型时使用了DM中的保留字,只需要加上双引号即可。

无法解析的成员访问表达式
如 错误消息: 第134 行附近出现错误:
无法解析的成员访问表达式[NLS_LOWER]

解决方法:NLS_LOWER 改为 LOWER (将大写的字符串转换为小写的字符串)

-[2665]: 记录超长(DM 中记录长度不能超过页大小的一半)
DM 在初始化的时候,默认的页大小是 8 KB,也就是说一个表一条记录的所有的字段的总长度不能超过 4 KB。选择的页大小影响后面表每行数据的长度,表每行的长度之和(普通数据类型)不能超过一页大小,如果超过 1 页大小即报记录超长的错误。

解决方法:(考虑实际场景选择)

​ 1 找到表中 varchar 类型比较长的(如 varchar2(8000)这种),修改成 text 类型;

​ 2 把页大小改为 16 KB 或者 32 KB;这是一个底层参数,在数据库生命周期内都不能更改,所以必须重新初始化。(对于表中 varchar2 类型较长,并且字段较多的情况不太适合,这种情况采用方法 1 解决。)

​ 3 利用该表的启用超长记录来解决;

​ 4 考虑使用大字段,大字段是不参与上述描述计算的。大字段长度能够达到 2 GB。但是要注意,大字段的使用和普通字段是有区别的。详情可以参考相关文档。

​ 5 如果从其他数据库通过 DTS 迁移工具将数据迁移到达梦,已经将页大小修改成 32K 仍然报错。可以重新初始化数据库,将页大小设置成 32K 的基础上,再将“Length_in_char”参数勾选上(或命令行初始化的时候,将“Length_in_char”设置成“Y”)

[-2106]: 无效的表或者视图名
用户访问其他不属于自己的模式,需要加上相对应的模式名。

解决方法:

​ 1 修改代码,加上对应的模式名;

​ 2 增加相关同义词

错误号: -6407 错误消息: 锁超时

解决方法:

​ 1 查出状态(STATE)为 IDLE 的session_id

select "V$SESSIONS".SESS_ID,"V$SESSIONS".SQL_TEXT,"V$SESSIONS".STATE,"V$SESSIONS".CURR_SCH,"V$SESSIONS".USER_NAME,"V$SESSIONS".TRX_ID,"V$SESSIONS".CREATE_TIME

from v$sessions  where trx_id in(

 select trx_id from v$lock where table_id in (

  select tab.id from sysobjects sch,sysobjects tab

  where tab.schid=sch.id and sch.name||'.'||tab.name='SYSDBA.TEST'))

and SQL_TEXT like '%insert%' or SQL_TEXT like '%update%' or SQL_TEXT like '%delete%';

​ 2 关闭对应的session_id

sp_close_session(sess_id)
ORA-08103: 对象不再存在
数据移植导入可能出现的问题

解决方法:

​ 可能由于导入的表为临时表,需要重新导入一遍

违反引用约束
这种问题主要是由外键约束造成的,父表的数据没有迁移,先迁移了子表的数据

解决方法:

​ 按照对应的顺序,先迁移父表的数据,再迁移子表的

违反唯一性约束
因为表中设置了唯一性约束或者主键约束,但是数据中有重复记录

解决方法:

​ 查看原始库的约束是否被禁用,或者是数据重复迁移造成的,若源表数据没有问题,则重新迁移该表数据

[-4080]不是group by表达式

解决方法:

​ 1 GROUP BY 和 ORDER BY 一起使用时,ORDER BY 要在 GROUP BY 的后面

​ 2 GROUP BY 后面必须有 ORDER BY 的字段

​ 3 在 select 需要查询的语句中选中的字段,必须出现在 GROUP BY 子句中

[-6111]:字符串转换出错
DM 执行 SQL 语句报错:字符串转换出错,但在 Oracle 可以执行。由于 CASE_COMPATIBLE_MODE 的默认参数为 1,DECODE 函数的选择方式与 ORACLE 机制不太一致,可以通过修改该参数或改写 SQL 的方式解决。

解决方法

​ 1 查询原先参数值,修改参数为2,并重启数据库生效

select * from v$dm_ini where para_name = 'CASE_COMPATIBLE _MODE';

SP_SET_PARA_VALUE(1,'CASE_COMPATIBLE _MODE',2);

​ 2 根据具体sql,改写sql实现

达梦 null 问题
在达梦中,手动调试存储过程入参不传值,或者动态sql调用过程入参传值'',不会被IS NOT NULL语句过滤

解决方法:

需要根据逻辑手动加上是否 = ''的判断

存储过程调用其他存储过程问题
在Oracle存储过程中可以直接用 对象名.过程名调用其他存储过程类似XX.AA_BB.,这种语法在达梦中很可能会报语法错误。

解决方法:

修改为"XX".AA_BB 或 CALL “XX”.AA_BB

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在将 Oracle 数据库迁移达梦数据库时,需要注意转换精度的问题。Oracle 数据库达梦数据库在数值类型的精度上存在差异,需要进行转换。 在 Oracle 数据库中,数值类型包括 NUMBER、FLOAT 和 BINARY_FLOAT 等。其中,NUMBER 类型可以指定精度和小数位数,例如 NUMBER(10,2) 表示精度为 10,小数位数为 2。FLOAT 和 BINARY_FLOAT 类型的精度由系统自动确定。 而在达梦数据库中,数值类型包括 NUMBER、FLOAT 和 DOUBLE 等。其中,NUMBER 类型可以指定精度和小数位数,例如 NUMBER(10,2) 表示精度为 10,小数位数为 2。FLOAT 和 DOUBLE 类型的精度由系统自动确定。 在将 Oracle 数据库迁移达梦数据库时,需要注意以下几点: 1. 转换精度:需要将 Oracle 数据库中的数值类型转换达梦数据库中相应的数据类型,并注意转换精度的问题。在转换过程中,需要确保达梦数据库中的精度和小数位数足够满足业务需求。 2. 数据溢出:由于 Oracle 数据库达梦数据库的数值类型精度不同,可能会出现数据溢出的情况。在进行数据迁移前,需要检查 Oracle 数据库中的数据是否会出现溢出的情况,并根据需要进行数据类型的转换或调整达梦数据库的精度。 3. 数据类型的兼容性:Oracle 数据库达梦数据库的数据类型不完全相同,需要进行数据类型的兼容性检查。在进行数据迁移前,需要检查 Oracle 数据库中的数据类型是否与达梦数据库中的数据类型兼容,如不兼容,需要进行相应的数据类型转换。 总之,在进行 Oracle 数据库达梦数据库迁移时,需要仔细检查数据类型的精度和兼容性,以确保数据迁移的准确性和完整性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值