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;
原文地址:https://www.cnblogs.com/zhutao1015/p/5972070.html