Database 调用过程时出现错误ORA-54033
调用过程时,我当前遇到以下Oracle错误: ORA-54033:要修改的列在虚拟列中使用 表情Database 调用过程时出现错误ORA-54033,database,oracle,oracle12c,Database,Oracle,Oracle12c,调用过程时,我当前遇到以下Oracle错误: ORA-54033:要修改的列在虚拟列中使用 表情 您知道如何查找此错误的根本原因吗?要查找数据库中所有虚拟列的表名和列名,可以运行以下查询: 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.O
您知道如何查找此错误的根本原因吗?要查找数据库中所有虚拟列的表名和列名,可以运行以下查询:
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_输出:
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;
声明
lobdll-CLOB;
程序转储_clob(clob中的aCLOB)为
nCLOB_长度数;
nCLOB_偏移数:=1;
nMax\u块大小编号:=32767;
施图克·瓦尔查尔2(32767);
开始
nCLOB_length:=DBMS_LOB.GETLENGTH(aCLOB);
当nCLOB_偏移“表”时,
name=>aRow.TABLE_name,
schema=>aRow.OWNER);
转储clob(LOBDLL);
端环;
结束;
祝你好运。以“SYS\u ST%”开头的虚拟列名确实属于extendet statistics。。。由于oracle 12c系统正试图自动识别和创建它们。。。只需在谷歌上搜索“oracle 12c自动列组检测”我就得到了相同的错误,如下所示进行修复 使用下面的命令获取隐藏列及其相关列
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")');
@引导程序我没有使用扩展统计信息。请提供过程调用…您调用的过程正在尝试更新计算虚拟列时使用的“实”列的数据类型。正如@BootStrapper指出的,这可能是由于使用扩展统计数据(您声明您没有这样做)造成的,也可能只是因为表中有一个虚拟列使用了过程试图更改的“real”列。祝你好运。@BobJarvis有什么办法可以列出我数据库中的所有虚拟列?谢谢你的查询。我现在在表中找到了一些虚拟列,但它们的名称类似于
SYS\u STSERN5WA2$#u GOCGFGAEQSSAF
。这个名字和什么东西对应吗?我怎样才能摆脱这些虚拟列呢?几乎所有以SYS
开头的内容都是系统生成的。当然,它与某些内容相对应,但在没有看到所讨论的表的完整DDL的情况下,我甚至无法猜测它可能是什么。您可以尝试编辑问题并包括表的DDL。祝你好运。我也遇到了这个错误,但这是在修改列的数据类型而不是调用过程时发生的。无论如何,jajikanth Pydimalla提供的解决方案仍然可行,应该标记为正确答案。