标度大于精度
达梦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