我试图弄清楚如何使用 pl/sql 对象类型实现对象组合。这是我的 super 简单的例子。
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".
因此,如果有人能给我建议,告诉我如何通过作文让学生成为人的一部分,同时让学生能够分辨出它是哪个人对象的一部分,我将不胜感激。
谢谢。
最佳答案
根据 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 文档
关于oracle - 是否可以在 PL/SQL 中使用对象组合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14322711/