2013-09-24 34 views
1

我有一個表(包含數據)在Oracle 11g中,我需要使用Oracle的SQLPlus做到以下幾點:的Oracle SQL列類型從數更改爲VARCHAR2,而它包含的數據

目標:更改類型列表TEST1在表UDA1numbervarchar2

提出的方法:

  1. 備份表
  2. 集列設置爲空
  3. 變化數據類型
  4. 恢復值

以下沒有工作。

create table temp_uda1 AS (select * from UDA1); 

update UDA1 set TEST1 = null; 
commit; 

alter table UDA1 modify TEST1 varchar2(3); 

insert into UDA1(TEST1) 
    select cast(TEST1 as varchar2(3)) from temp_uda1; 
commit; 

有一些與索引(保持秩序),對嗎?

+0

您最近的'insert'語句需要是'update'。 –

+0

另外,有人告訴我「表有鑰匙」,我需要用鑰匙導出......然後用鑰匙匹配恢復。這是正確的嗎? – Din

+1

你的意思是「有人告訴我桌子上有鑰匙」......你知道桌子嗎? – SriniV

回答

18
create table temp_uda1 (test1 integer); 
insert into temp_uda1 values (1); 

alter table temp_uda1 add (test1_new varchar2(3)); 

update temp_uda1 
    set test1_new = to_char(test1); 

alter table temp_uda1 drop column test1 cascade constraints; 
alter table temp_uda1 rename column test1_new to test1; 

如果列上有索引需要重新創建它。

請注意,如果你有舊列包含數字的更新將失敗大於999。如果你這樣做,你需要調整的varchar

+1

這是針對Oracle的,是的。它不需要使用SQL * Plus運行。您可以使用任何SQL客戶端。 –

+0

你在這裏做什麼?alter table temp_uda1 add(test1_new varchar2(3)); – Din

+0

^不應該是:alter table UDA1 modify TEST1 VARCHAR2(3); 我想改變以前的專欄,而不是添加一個新的專欄.. – Din

1

來看一下Oracle的包DBMS_REDEFINE最大值。有了運氣,你可以在不停機的情況下進行在線操作 - 如果需要的話。否則,你可以:

  • 添加新VARCHAR2
  • 使用updateNUMBER複製到VARCHAR2
  • NUMBER
  • 重命名VARCHAR2
2

添加新列VARCHAR2,複製數據對此列刪除舊列,將新列重命名爲實際列名稱:

ALTER TABLE UDA1 
ADD (TEST1_temp VARCHAR2(16)); 

update UDA1 set TEST1_temp = TEST1; 

ALTER TABLE UDA1 DROP COLUMN TEST1; 

ALTER TABLE UDA1 
RENAME COLUMN TEST1_temp TO TEST1; 
相關問題