调用过程时出错ORA-54033

时间:2015-08-24 14:05:11

标签: database oracle oracle12c

我在调用过程时遇到以下Oracle错误:

  

ORA-54033:要修改的列用于虚拟列   表达

您知道如何找出此错误的根本原因吗?

3 个答案:

答案 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")');