当我添加另一个继承子对象类型时,父对象类型的 Oracle PL/SQL table 中断

Oracle PL/SQL table of parent object type breaks when I add another inheriting child object type

我在 Oracle PL/SQL 中使用自定义对象类型,包括几个从父对象继承的对象类型。我有一个 TP_DOCUMENTS 父对象和子文档类型,例如 TP_PUBLICATION、TP_CONTRACT 等。我们成功创建了 TP_DOCUMENT 的 table 并添加了TP_PUBLICATION、TP_CONTRACT 和其他子文档记录的记录。但是,我需要创建另一种类型的文档。一旦我这样做了,它就破坏了文档 table。如何在不破坏父对象的 table 的情况下创建其他子类型(使我丢失以前包含在父对象 table 中的所有数据!!)?

这是我的一些代码:

create or replace TYPE           "TP_DOCUMENT" AS OBJECT 
( 
...fields go here
) NOT FINAL

create or replace TYPE           "TP_PUB_INSTRUCTION" UNDER TP_DOCUMENT()

CREATE TABLE DOCUMENTS OF TP_DOCUMENT

创建这些类型(以及其他具有附加字段的类型)后,我创建了 table 文档,如上所示。我试图创建另一个子类型,但文档 table 损坏了。

更多信息:

报错代码信息如下:

ORA-04063: table/view 有错误

Cause:  Attempt to execute a stored procedure or use a view that has errors.  For stored procedures, the problem could be syntax errors or references to other, non-existent procedures.    For views,  the problem could be a reference in the view's defining query to a non-existent table.  Can also be a table which has references to non-existent or inaccessible types.   

Action: Fix the errors and/or create referenced objects as necessary. 

谢谢!

更新以下评论者的回答:

不幸的是,我使用强制选项删除了一个子类型。这可能是我的文档 table 损坏的原因。以后,我会使用 Validate 命令(见下面的回答)。

在删除类型时,您应该使用 VALIDATE 选项而不是 FORCE

VALIDATE

If you specify VALIDATE when dropping a type, then Oracle Database checks for stored instances of this type within substitutable columns of any of its supertypes. If no such instances are found, then the database completes the drop operation.

This clause is meaningful only for subtypes. Oracle recommends the use of this option to safely drop subtypes that do not have any explicit type or table dependencies.

这是一个例子:

create or replace type tp_document as object 
( 
    a number
) not final;

create or replace type tp_pub_instruction under tp_document();

create table documents of tp_document;

--This fails with this error message:
--ORA-02303: cannot drop or replace a type with type or table dependents
drop type tp_pub_instruction;

--This works since there's no data with that type.
drop type tp_pub_instruction validate;