我在调用过程时遇到以下Oracle错误:
ORA-54033:要修改的列用于虚拟列 表达
您知道如何找出此错误的根本原因吗?
答案 0 :(得分:1)
要查找数据库中所有虚拟列的表名和列名,可以运行以下查询:
SELECT c.OWNER, c.TABLE_NAME, c.COLUMN_NAME
FROM DBA_TAB_COLS c
WHERE c.VIRTUAL_COLUMN = 'YES' AND
c.OWNER NOT IN ('SYS', 'XDB')
ORDER BY c.OWNER, c.TABLE_NAME, c.COLUMN_NAME;
您可以使用以下脚本将包含虚拟列的数据库中所有表的DDL转储到DBMS_OUTPUT:
DECLARE
lobDDL CLOB;
PROCEDURE dump_clob(aCLOB IN CLOB) IS
nCLOB_length NUMBER;
nCLOB_offset NUMBER := 1;
nMax_chunk_size NUMBER := 32767;
strChunk VARCHAR2(32767);
BEGIN
nCLOB_length := DBMS_LOB.GETLENGTH(aCLOB);
WHILE nCLOB_offset <= nCLOB_length LOOP
strChunk := DBMS_LOB.SUBSTR(aCLOB, nMax_chunk_size, nCLOB_offset);
DBMS_OUTPUT.PUT(strChunk);
nCLOB_offset := nCLOB_offset + LENGTH(strChunk);
END LOOP;
DBMS_OUTPUT.PUT_LINE(';');
END dump_clob;
BEGIN
FOR aRow IN (SELECT DISTINCT c.OWNER, c.TABLE_NAME
FROM DBA_TAB_COLS c
WHERE c.VIRTUAL_COLUMN = 'YES' AND
c.OWNER NOT IN ('SYS', 'XDB')
ORDER BY c.OWNER, c.TABLE_NAME)
LOOP
lobDDL := DBMS_METADATA.GET_DDL(object_type => 'TABLE',
name => aRow.TABLE_NAME,
schema => aRow.OWNER);
dump_clob(lobDDL);
END LOOP;
END;
祝你好运。
答案 1 :(得分:0)
以'SYS_ST%'开头的虚拟列名称确实属于extendet统计信息...并且自从oracle 12c以来系统正在尝试自动识别和创建它们...只需谷歌搜索“oracle 12c自动列组检测”
答案 2 :(得分:0)
我得到了同样的错误,修复方法如下。
使用下面的方法获取隐藏的列及其相关列。
SELECT COLUMN_NAME, DATA_DEFAULT, HIDDEN_COLUMN
FROM USER_TAB_COLS
WHERE TABLE_NAME = 'YOUR_TABLE_NAME';
你应该看到如下所示的一些
SYS_STUMF_$2WEF286CDZ1WPC4V_F5 |SYS_OP_COMBINED_HASH("ID","FIRST_NAME","ANOTHER_COLUMN_NAME") | YES
使用上面使用的列名删除此隐藏列。
exec dbms_stats.drop_extended_stats(user, 'YOUR_TABLE_NAME', '("ID","FIRST_NAME","ANOTHER_COLUMN_NAME") ');
现在运行您的程序或更改您的列。
alter table YOUR_TABLE_NAME modify (ID VARCHAR2(10));
再次创建隐藏列
exec dbms_stats.create_extended_stats(user, 'YOUR_TABLE_NAME', '("ID","FIRST_NAME","ANOTHER_COLUMN_NAME")');