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の文書によると、両方のオブジェクト・タイプで相互に依存するオブジェクトの実際のインスタンスを持つことはできません。それらの少なくとも1つは参照である必要があります。

注:論理的にSTUDENTはPERSONに依存しているように見えるため、私は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 に答える