注册
Oracle迁移到达梦后,大小写敏感导致小写对象、字段名不能正常查询
专栏/技术分享/ 文章详情 /

Oracle迁移到达梦后,大小写敏感导致小写对象、字段名不能正常查询

Gu_Rainbow 2025/07/25 196 0 0
摘要

oracle迁移到达梦后,如果达梦实例是大小写敏感的,会存在达梦中无法查询到部分小写对象的问题。

这是因为oracle的字段名、对象名都是大小写不敏感的,使用dbms_metadata.get_ddl函数取到的oracle对象ddl,会存在大小写混杂的情况。
这样的ddl在导入大小写敏感的达梦实例中,就会导致部分对象名、字段名是小写状态。
由于达梦管理工具会默认吧对象名转为大写,对于对象名或字段名是小写状态的情况,是不能直接查询和操作的。

如果不想重新导库,以下是一个解决方法:

–查询所有小写的对象名,按照object_name倒序排序,这样所有的小写对象都会在前面,计算行数。

select * from (select * from dba_objects order by object_name desc)order by object_type ;

–查询所有小写的表字段名,按照column_name倒序排序,这样所有的小写对象都会在前面,计算行数。注意,中文字段名会排在最前面。

select * from (select * from DBA_TAB_COLS order by column_name desc) ;

–生成rename对象名。

select 'alter '||object_type||' "'||object_name||'" rename to '||upper(object_name)||';' from 
(select * from (select * from dba_objects order by object_name desc) 
where rownum<=行数) where owner='$SCHEMA_NAME' order by object_type;

–注意,这里生成的语句需要使用对应的用户来执行,达梦不支持alter table a.“table1” rename to a.TABLE1; 这样的语句,会报语法错误。
–另外存储过程、包、函数、约束是不能rename的。存储过程、包、函数对象需要逐个重建,并把原来的小写对象删除。

–生成rename表字段名的语句,此处生成的语句可以直接用sysdba用户或有dba权限的用户执行,一次性解决所有小写字段名问题。

select 'alter table '||owner||'.'||table_name||' rename column "'||column_name||'" to '||upper(column_name)||';' from 
(select * from (select * from DBA_TAB_COLS order by column_name desc) 
where rownum<行数) order by column_name;
评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服