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;
文章
阅读量
获赞