1. 程式人生 > >ORACLE-1:虛擬列影響alter修改表字段操作!

ORACLE-1:虛擬列影響alter修改表字段操作!

數據 解決方案 IV 由於 () tro 執行效率 info exe

一、問題:

  昨天想要修改Oracle數據庫中某張表的某個字段,發現怎麽都修改不成功!!!並給出了如下提示:

  ORA-54031:要刪除或修改的列由某個虛擬列表達式使用 

二、啥是“虛擬列” 【不可見的列】

  虛擬列的創建一般是數據庫自動創建的,當然也可以手動創建。

  什麽時候創建:表中的數據,大量或頻繁的發生變化的時候,數據庫一般會自動創建虛擬列!

  我覺得截一個漂亮的圖,比我的一個字一個字的敲的更容易理解!哈哈哈!

技術分享圖片

  Oralce 的虛擬列解決了以前很多需要使用觸發器或者需要通過代碼進行計算統計才能產生的數據信息。以前每次對其他的列進行統計,產生新列的時候都是采用在select 語句中通過統計計算增加新列的方法,執行效率很低,而且由於使查詢SQL語句變得冗長、復雜很容易出錯。嚴重的降低了開發效率和程序的執行效率。Oralce虛擬列的引入解決了這個問題。

  Oralce 的虛擬列也有一些問題。不能使用insert into talbe_name values ().語句,在向含有虛擬列的表中添加數據時,要求insert語句的必須把添加的表的列名寫出來。insert into table_name (list1,list2,...listend)列名中不能出現虛擬列名,否則會提示錯誤。

  下面羅列一下解決方案:

二、幾種解決方案

(1)先備份數據,備份表結構,再delete該表,再創建表(修改列信息),再導入數據!

    數據量少的時候,無所謂,可以這麽做,但是如果數據量過多,那麽弊端就很明顯了!

(2)drop當前虛擬列。流程如下:

 1 --:查詢指定表的虛擬列信息:
 2 --select  column_name,data_default,hidden_column 
 3 --from user_tab_cols 
 4 --where table_name=‘CB_BATCH_FLOW‘ AND column_name=‘BFL_OPRNO‘
 5 
 6 --說明:修改步驟:
 7 --(1)先查詢user_tab_cols表.列的虛擬列data_default字段的信息,取其中的HASH值
 8 --(2)如果(1)查到了HASH值,才需要執行exec 刪除該列的虛擬列操作,如果沒有查找HASH值,則不需要刪除虛擬列
9 --(3)刪除虛擬列之後,此時可以alter 10 --格式: 11 -- exec dbms_stats.drop_extended_stats(‘ebank‘,‘CB_BATCH_FLOW‘,‘BFL_CSTNO,CCP_USERID)‘); ---刪除虛擬列 12 -- alter table CB_BATCH_FLOW modify BFL_CSTNO varchar2(10);                         ---修改列信息 13 -- select dbms_stats.create_extended_stats(‘ebank‘,‘CB_BATCH_FLOW‘,‘(CCP_CSTNO,CCP_USERID)‘) FROM DUAL; ---新增虛擬列

執行截圖:

1、exec 執行方法參數傳入錯誤

技術分享圖片

2、成功刪除虛擬列

技術分享圖片

3、成功創建一個虛擬列

技術分享圖片

但是,成功創建的虛擬列的在:user_tab_cols表中的COLUMN_NAME字段存入的值是隨機的,

技術分享圖片 

ORACLE-1:虛擬列影響alter修改表字段操作!