これは、 PL / SQLでオブジェクトコンポジションを使用することは可能ですか?のフォローアップ質問です。
その質問は、相互に依存するPL / SQLでオブジェクト型を作成する方法に対処しました(つまり、各オブジェクトの1つの属性が他のオブジェクトへの参照です)。
私が遭遇した次の問題は、オブジェクトコンストラクターに関係しています。これがコードです(論理的には、学生は人の中に存在します)。また、コメントでこれを排除するために、継承を使用することは私にとってオプションではありません。
人物オブジェクト
CREATE OR REPLACE TYPE PERSON FORCE AUTHID DEFINER UNDER MYSCHEMA.BASE_OBJECT (
student MYSCHEMA.student,
additional attributes...
CONSTRUCTOR FUNCTION PERSON
RETURN SELF AS RESULT
) NOT FINAL;
CREATE OR REPLACE TYPE BODY PERSON
AS
CONSTRUCTOR FUNCTION PERSON
RETURN SELF AS RESULT IS
BEGIN
self.student := NEW MYSCHEMA.STUDENT(self);
RETURN;
END;
END;
学生オブジェクト
CREATE OR REPLACE TYPE STUDENT FORCE AUTHID DEFINER UNDER MYSCHEMA.BASE_OBJECT (
person REF MYSCHEMA.PERSON,
CONSTRUCTOR FUNCTION STUDENT(p_person REF MYSCHEMA.PERSON)
RETURN SELF AS RESULT
) NOT FINAL;
CREATE OR REPLACE TYPE BODY STUDENT
AS
CONSTRUCTOR FUNCTION STUDENT(p_person REF MYSCHEMA.PERSON)
RETURN SELF AS RESULT IS
BEGIN
self.person := p_person;
RETURN;
END;
END;
このコードは、PERSON内のSTUDENTオブジェクトをインスタンス化するPERSONコンストラクター内の次の行を除いて、エラーなしでコンパイルされます。
self.student := NEW MYSCHEMA.STUDENT(self);
これは次のエラーをスローします:
Error(22,29): PLS-00306: wrong number or types of arguments in call to 'STUDENT'
それで、親愛なる友人たち、私はあなたの助けをもう一度求めます。STUDENTコンストラクターに暗黙的に渡される追加のパラメーターがあると推測していますが、それは単なる推測です。
ありがとう。