代码之家  ›  专栏  ›  技术社区  ›  mdemir

删除表标识导致Oracle 12c上出现ORA-00600错误

  •  4
  • mdemir  · 技术社区  · 6 年前

    我的Oracle DB版本是12.1.0.2.0。

    我很难删除列标识。还尝试使用purge命令删除列和表,但每次都出现相同的Oracle错误:

    ORA-00600:内部错误代码,参数:[12811],[96650],[],[],[],[],[],[],[],[],[],[],[],[]

    就是摸不到身份栏。我尝试了以下命令,但没有成功:

    ALTER TABLE DYS_CATEGORY MODIFY CATEGORY_ID DROP IDENTITY;
    
    ALTER TABLE DYS_CATEGORY DROP COLUMN CATEGORY_ID;
    
    DROP TABLE DYS_CATEGORY PURGE;
    

    我可以从表中删除任何其他列,但问题是 标识列 .

    Identity列是Oracle的新特性,刚刚在12c中引入。

    3 回复  |  直到 6 年前
        1
  •  1
  •   APC    6 年前

    这是Oracle 12.1.0.2.0的一个问题。至少还有一个人 reported it (on Windows, which may be relevant) .

    您的错误是ORA-00600,这是Oracle针对未处理异常(即Oracle Bug)的默认消息。正确的答案是向Oracle支持部门提出服务请求;如果您需要修复损坏的表,他们将能够为您提供补丁或解决方法。如果你没有支持合同,你可能会倒霉。

    以备将来参考 identity 列是一个两阶段的过程:

    alter table t42 modify id drop identity;
    
    alter table t42 drop column id;
    

    碰巧,这在最新版本的产品上不是问题。在Oracle 18c中,我们可以直接删除列,而不必先修改它。 LiveSQL demo .

        2
  •  1
  •   Roman Skydan    6 年前

    正如William在上文中所说,似乎有/曾经有一个系统生成了标识列的序列,该序列已被删除,但记录 idnseq$ 保持完整。

    我不会向任何人推荐这个,但我在同一个模式中创建了一个名为“垃圾”的新序列。然后我找到了 object_id 对于我创建和更新的表和序列 idnseq$ 手动更改 seqobj# 对象\u id 正在讨论的表的对象#的新序列。

    然后我就可以放下桌子,成功地清除回收站。

        3
  •  0
  •   Pingolin BenJ    5 年前

    经过大量搜索和努力,如果表仍然显示错误ORA-00600:内部错误代码,参数:

    执行以下步骤。

    1. 备份原始表 语法: Create table original_table_back as select * from original_table;

    2. 将原始表重命名为某个新表名 语法: Rename original_table to original_table_1;

    3. 将备份重命名为原始表 Rename Original_table_back to original_table.