ORA-54033要修改的列由某個虛擬表達式使用column to be modified is used in a virtual column expression


oracle 11g添加了新特性虛擬字段,而oracle 12c增加在多個表上收集統計信息。通過在12c版本提高查詢性能,開始自動收集信息時會自動創建虛擬列。

通過語句可以查詢創建那些虛擬列。

select column_name, data_default, hidden_column 
from   user_tab_cols
where  table_name = 'TAB';

COLUMN_NAME                         DATA_DEFAULT                   HID
------------------------------     -----------------------------   ---
SYS_STUYPW88OE302TFVBNC6$MMQXE    SYS_OP_COMBINED_HASH("X","Y")    YES
Z                                                                  NO
Y                                                                  NO
X                                                                  NO

可以通過語句刪除和創建虛擬列

exec dbms_stats.drop_extended_stats(user, 'tab', '(x, y)');

alter table tab modify (y timestamp);

select dbms_stats.create_extended_stats(user, 'tab', '(x, y)')
from   dual;

DBMS_STATS.CREATE_EXTENDED_STATS(USER,'TAB','(X,Y)')                           
--------------------------------------------------------------------------------
SYS_STUYPW88OE302TFVBNC6$MMQXE  

pl sql刪除表上虛擬列

declare
       --類型定義
       cursor c_job
       is
       --查找統計擴展的隱藏列信息
       select  data_default from   user_tab_cols where  hidden_column='YES' and table_name = 'tab';
       --定義一個游標變量v_cinfo c_emp%ROWTYPE ,該類型為游標c_emp中的一行數據類型
       c_row c_job%rowtype;   
       sUser varchar(200);    
begin  
       select user into sUser  from dual;
       for c_row in c_job loop
         --執行刪除操作
         execute immediate 'begin dbms_stats.drop_extended_stats('''||sUser||''', ''tab'', '''||replace(replace(c_row.data_default,'SYS_OP_COMBINED_HASH',''),'"','')||'''); end;';
       end loop;
end;

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM