Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database 调用过程时出现错误ORA-54033_Database_Oracle_Oracle12c - Fatal编程技术网

Database 调用过程时出现错误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

调用过程时,我当前遇到以下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.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提供的解决方案仍然可行,应该标记为正确答案。