2

我试图弄清楚如何使用 pl/sql 对象类型来实现对象组合。这是我的超级简单的例子。

CREATE OR REPLACE TYPE PERSON FORCE AUTHID DEFINER UNDER MYSCHEMA.BASE_OBJECT (
    student                 ND_COMMON_ADMIN.STUDENT
) NOT FINAL;

CREATE OR REPLACE TYPE STUDENT FORCE AUTHID DEFINER UNDER MYSCHEMA.BASE_OBJECT (
    person                  ND_COMMON_ADMIN.PERSON,
    application_checklist   ND_COMMON_ADMIN.APPLICATION_CHECKLIST
) NOT FINAL;

您可以看到那个人(所有者对象)包含学生对象。您还可以看到学生包含一个人员对象(否则,学生将无权访问人员的数据......对吗?)

然而,PL/SQL 不喜欢这些对象相互引用并引发以下错误:

Error: ORA-04055: Aborted: "PERSON" formed a non-REF mutually-dependent cycle with "STUDENT".

所以,如果有人能给我建议,让我通过作文让学生成为人的一部分,而且让学生能够分辨出它属于哪个人对象,我将不胜感激。

谢谢。

4

1 回答 1

3

根据 ORA-04055 的文档和以下 URL,您不能在两种对象类型中都有相互依赖的对象的实际实例。其中至少有一个必须是参考。

注意:我将 PERSON 的定义放在首位,因为逻辑上 STUDENT 似乎是 PERSON 的依赖项。但是,如果不是这种情况,可以交换声明顺序。

此外,必须首先完全定义包含另一个对象的实际实例的对象。

这将编译,如果两个对象都具有其他对象的 REF 类型,它将编译,但反之则不会。

CREATE OR REPLACE TYPE STUDENTC;

CREATE OR REPLACE TYPE PERSONC   AS OBJECT (
    student1  REF STUDENTC
) NOT FINAL;
/
CREATE OR REPLACE TYPE STUDENTC   AS OBJECT  (
    person1   PERSONC,
    application_checklist   INTEGER
) NOT FINAL;
/


参考:

http://psoug.org/definition/REF.htm

http://docs.oracle.com/cd/A87860_01/doc/appdev.817/a76976/adobjmng.htm

http://docs.oracle.com/cd/E11882_01/appdev.112/e11822/adobjmng.htm#i1003083

请参阅 ORA-04055 的 ORACLE 文档

于 2013-01-14T17:20:47.637 回答