我得到了一个包含以下内容的脚本:
alter table TABLE_1 add constraint pk_1 primary key(ID_1)
using index
tablespace schema1_ind
exceptions into junk;
问题是,当我运行它时,它会引发此错误:
ORA-02445: exceptions table not found
我对异常表不太熟悉,在网上能找到的信息也很少。我在 Oracle 上找到了这份文档,https://docs.oracle.com/cd/A58617_01/server.804/a58312/newch2h5.htm,其中有以下内容:
ORA-02445: 未找到异常表
原因:明确或隐含声明的异常表不存在。 操作:如果使用了正确的异常表名,则创建该表并重试启用命令。
我还发现了这个https://docs.oracle.com/en/database/oracle/oracle-database/19/refrn/EXCEPTIONS.html:
EXCEPTIONS 包含有关违反完整性约束的信息。此表由 utlexcpt.sql 脚本创建。
但是,非常奇怪的是,当我运行同样使用“垃圾”的不同脚本时,它运行时没有错误:
alter table TABLE_2 add constraint PK_2
primary key(ID_2)
using index tablespace schmea1_ind2
storage (initial 8M NEXT 2M)
exceptions into junk;
这些脚本都按照一定的顺序运行,最下面的脚本首先运行,成功运行而没有问题,然后运行一堆其他脚本,最后尝试运行最上面的脚本并失败。
问题是,我不知道如何找到这个“垃圾”异常表。我尝试单独运行第一个脚本,它成功了,但之后当我查看 DBA_OBJECTS 时,没有找到任何名为“垃圾”的东西。什么都没有。任何地方都没有创建或删除名为“垃圾”的表。
有人能解释一下为什么我会收到“未找到异常表”错误吗?如果异常表不在 dba_objects 中,那么它在哪里?为什么第一个语句失败,而第二个语句成功?
任何有关异常表的知识都会有帮助,因为我发现的文档很少。
这可能是因为该表中没有重复项。Oracle 通常不会抱怨异常表不存在,除非需要使用它。
这个小提琴演示了;如果
alter table
在主表为空或仅具有唯一数据时运行,则它不会抱怨;一旦有重复的 PK 值,就会抱怨。它似乎不存在,所以您需要创建它。使用Bohemian 链接到的文章中的版本:
...你的语句然后得到“ORA-02437:无法验证(schema.PK_1) - 违反主键”。
小提琴
文档中显示了异常表结构,其中包含脚本使用的默认名称
utlexcpt.sql
(以及比上述版本更大的列)。您可以在文档中的“处理约束异常”标题下的其他位置阅读有关该概念的更多信息。