2016-08-19 18 views
2

私は現在PL/SQLの問題に苦しんでおり、Ididn'tはまだ明確な答えを見つけていません。問題は、タイプTのオブジェクトがあります。タイプTのオブジェクトのリストを含めることができます。同じオブジェクトのリストを含むOracleオブジェクト

私はTPerson型を持っているとしましょう。 TPersonは、名前と子のリストによって定義されます。私は祖父とその2人の息子がいて、最初の息子には2人の娘がいます。 PL/SQLで

は、いくつかの研究の後、私はこれをしなかった:

CREATE OR REPLACE TYPE TPerson IS OBJECT 
    (
    Name    VARCHAR2(30), 
    Children   REF TPersonList, 
    constructor function TPerson(name VARCHAR2) return self as result 
    ); 

CREATE OR REPLACE TYPE body TPerson as 
    constructor function TPerson(aname VARCHAR2) return self as result is 
     begin 
      Name  := aname; 
      Children := TPersonList(); 
      return; 
     end; 
    end; 

CREATE OR REPLACE TYPE TPersonList IS TABLE OF REF TPerson'; 

すべてが例外なく動作します。しかしTPersonタイプが正しくコンパイルされない、と私はこのコンパイル・エラーがあります。

pls-00532 target of ref must be a complete or incomplete object type 

をそれは私がこのREFのものを使用して初めてです。私はそれを正しく使っているかどうかはわかりません。私の意見では、これを行うには本当に良い方法ではありませんが(子供のこと)、私には選択肢がありません。だから誰かが私にそれを達成するための適切な方法を説明することができれば、それは私に多くの助けとなるでしょう...

+0

これは存在しない型を参照しようとしていて、存在しない型を参照している型を作成しようとしているときに構文上正しくありません。あなたは最初に完全な定義をする必要があります。 – XING

答えて

0

私は、オブジェクト型が同じ型のコレクションのメンバーコレクションの前にオブジェクト型とオブジェクト型の前にコレクションを定義することができます。あなたがサブタイプにスーパータイプから絞り込むことtreatを使用PERSON_Tの実装に

-- supertype 
create type object_t is object; 
create type object_list_t is table of ref object_t; 

-- subtype 
create type person_t under object_t (
name varchar2(20) 
,children object_list_t 
); 

そして:循環依存関係の1を解除するには、次のファッション(警告非テスト擬似コードは以下の)に間接のレベルを導入する必要があります。

もう1つのアイデアは、オブジェクトの関係を特定の関係テーブルに持たせることです。以下の例を参照してください。

まず、単純な人型を作成します。

create type person_t is object (
name varchar2(20) 
); 
/
show errors 

create table persons of person_t; 

insert into persons values(person_t('Grandfather')); 
insert into persons values(person_t('Father')); 
insert into persons values(person_t('Mother')); 
insert into persons values(person_t('Son 1')); 
insert into persons values(person_t('Daughter 1')); 
insert into persons values(person_t('Son 2')); 

第二の親子関係のテーブルを作成します。

create table x (
parent ref person_t 
,child ref person_t 
); 

-- build a family tree 
insert into x values(
(select ref(p) from persons p where name = 'Grandfather') 
,(select ref(p) from persons p where name = 'Father') 
); 

insert into x values(
(select ref(p) from persons p where name = 'Father') 
,(select ref(p) from persons p where name = 'Son 1') 
); 

insert into x values(
(select ref(p) from persons p where name = 'Father') 
,(select ref(p) from persons p where name = 'Son 2') 
); 

insert into x values(
(select ref(p) from persons p where name = 'Father') 
,(select ref(p) from persons p where name = 'Daughter 1') 
); 

insert into x values(
(select ref(p) from persons p where name = 'Mother') 
,(select ref(p) from persons p where name = 'Son 1') 
); 

insert into x values(
(select ref(p) from persons p where name = 'Mother') 
,(select ref(p) from persons p where name = 'Son 2') 
); 

insert into x values(
(select ref(p) from persons p where name = 'Mother') 
,(select ref(p) from persons p where name = 'Daughter 1') 
); 

今、あなたは古き良きSQLで家系図をたどることができます。

column parent format a30 
column child format a30 

select deref(child) as child from x where deref(parent).name = 'Father'; 

CHILD(NAME) 
------------------------------ 
PERSON_T('Son 1') 
PERSON_T('Son 2') 
PERSON_T('Daughter 1') 

select deref(parent) as parent, deref(child) as child 
from x 
start with deref(parent).name = 'Grandfather' 
connect by prior child = parent 
; 

PARENT(NAME)     CHILD(NAME) 
------------------------------ ------------------------------ 
PERSON_T('Grandfather')  PERSON_T('Father') 
PERSON_T('Father')    PERSON_T('Son 1') 
PERSON_T('Father')    PERSON_T('Son 2') 
PERSON_T('Father')    PERSON_T('Daughter 1') 

refderef機能はDatabase Object-Relational Developer's Guideで説明されています。これは、Oracleオブジェクト型を操作する場合に慣れておくべきドキュメントです。

+0

まあ、それは素晴らしい答えです!私が言ったように、方法は私に課されたものでしたが、うまくいかなかったので...私はこの方法を私のマネージャーに提出します。どうもありがとう ! – Mastard

+0

@Mastardあなたが役に立つ例を見つけたと聞いてうれしいです。しかし、パフォーマンスに注意してください。私はこの機能を使用したことがないので、refrefを選択するとパフォーマンスにどのような影響があるのか​​分かりません(たとえば 'where deref(parent).name = 'Father'')。 – user272735

関連する問題