在sql移植到oracle過程中,都會遇到表名和字段名大寫的問題,因為在oracle中默認表名和字段名都是大寫的,雖然可以通過使用雙引號的方式進行操作,如select * from "testtable"但是很多情況下,這樣做的代價很大,因為很多程序的代碼是早已經寫好的,而要修改oracle系統配置又不安全,一個比較穩妥的辦法是批量修改表名和文件名。
先說在SQL中修改表名和字段名的辦法:雖然在sql中默認是不區分表名和字段名的大小寫的,但是通過sql的DTS進行數據導出導入的時候,如果表名和字段名是小寫,那生成的代碼中對應也是小寫,反之亦然。因此通過此辦法生成oracle數據表的時候就需要首先批量把sql中的表名和字段名都修改為大寫,下面給出的是對應的代碼。
批量修改表名:
1
declare
@sql
varchar(
300)
--
,@rowcount varchar(10),@dyncnum int
2 declare @tablename varchar( 100)
3 declare cursor1 cursor for
4 select name from sysobjects where xtype = ' u ' order by name
5 open cursor1
6 fetch next from cursor1 into @tablename
7 while @@fetch_status = 0
8 begin
9 set @sql = ' sp_rename ''' + @tablename + ''' , ''' + upper( @tablename) + ''''
10 print @sql
11 -- exec(@sql)
12 fetch next from cursor1 into @tablename
13 end
14 close cursor1
15 deallocate cursor1
2 declare @tablename varchar( 100)
3 declare cursor1 cursor for
4 select name from sysobjects where xtype = ' u ' order by name
5 open cursor1
6 fetch next from cursor1 into @tablename
7 while @@fetch_status = 0
8 begin
9 set @sql = ' sp_rename ''' + @tablename + ''' , ''' + upper( @tablename) + ''''
10 print @sql
11 -- exec(@sql)
12 fetch next from cursor1 into @tablename
13 end
14 close cursor1
15 deallocate cursor1
批量修改字段名代碼:
1
declare
@sql
varchar(
300)
2 declare @tablecolumnname varchar( 100), @columnname varchar( 100)
3 declare cursor1 cursor for
4 select b.name + ' .[ ' +a.name + ' ] ',a.name from syscolumns a ,sysobjects b where a.id = object_id(b.name) and b.xtype = ' u ' and a.xtype <> 189 and a.xtype <> 34 and a.xtype <> 35 and a.xtype <> 36
5 open cursor1
6 fetch next from cursor1 into @tablecolumnname, @columnname
7 while @@fetch_status = 0
8 begin
9 set @sql = ' sp_rename ''' + @tablecolumnname + ''' , ''' + upper( @columnname) + ''' , '' column '''
10 -- print @sql
11 exec( @sql)
12 fetch next from cursor1 into @tablecolumnname, @columnname
13 end
14 close cursor1
15 deallocate cursor1
2 declare @tablecolumnname varchar( 100), @columnname varchar( 100)
3 declare cursor1 cursor for
4 select b.name + ' .[ ' +a.name + ' ] ',a.name from syscolumns a ,sysobjects b where a.id = object_id(b.name) and b.xtype = ' u ' and a.xtype <> 189 and a.xtype <> 34 and a.xtype <> 35 and a.xtype <> 36
5 open cursor1
6 fetch next from cursor1 into @tablecolumnname, @columnname
7 while @@fetch_status = 0
8 begin
9 set @sql = ' sp_rename ''' + @tablecolumnname + ''' , ''' + upper( @columnname) + ''' , '' column '''
10 -- print @sql
11 exec( @sql)
12 fetch next from cursor1 into @tablecolumnname, @columnname
13 end
14 close cursor1
15 deallocate cursor1
還有一種情況就是,表已經導入到oracle中了,但是發現表名和字段名都是小寫,需要在oracle中修改表名和字段名。
這個時候,我們需要使用一種辦法來幫我們自動生成修改的語句,然后copy出來執行就可以了。
修改表名:
1
select
'
alter table "
'
||table_name
||
'
" rename to
'
||
upper(table_name)
||
'
;
'
from user_tables
where table_name
<>
upper(table_name);
修改字段名:
1
select
'
alter table
'
||table_name
||
'
rename column "
'
|| column_name
||
'
" to
'
||
upper(column_name)
||
'
;
'
2 from user_tab_columns where column_name <> upper(column_name);
2 from user_tab_columns where column_name <> upper(column_name);
這個時候,我們可以在sql plus或者toad等客戶端工具中生成對應的alter語句,然后copy出來執行就ok了。
引申一下,如果需要把oracle中的數據全部清空或者把表全部刪除,也可以采用如上的方式
--
清除數據
select ' TURNCATE table ' ||table_name || ' ; ' from user_tables;
-- 刪除表
select ' drop table ' ||table_name || ' ; ' from user_tables;
select ' TURNCATE table ' ||table_name || ' ; ' from user_tables;
-- 刪除表
select ' drop table ' ||table_name || ' ; ' from user_tables;