1

Oracle PSL/SQL で以下を作成しました。

タイプを作成しましたAnimal
これには属性があります: 名前、年齢

タイプを作成しましたDog。これは type から継承しAnimal
ます。 の唯一の追加フィールドDogは、住んでいた場所の参照のネストされたテーブルです。DogのすべてのインスタンスをAnimal テーブル に格納したいと考えています。

これは私が混乱しているビットです: タイプの動物テーブルを作成するときAnimal、ネストされたテーブルを作成するにはどうすればよいplaces livedですか? AnimalこのためのフィールドはありませんDog

4

1 に答える 1

6

「動物型の動物テーブルを作成するとき、「住んでいた場所」のネストされたテーブルを作成するにはどうすればよいですか?このためのフィールドが動物にはなく、犬だけです。」

これが遺伝の謎です。タイプ ANIMAL から構築されたテーブルには、実際にはそのサブタイプの属性をサポートする列があります。ただし、DOG サブタイプを明示的に使用する場合にのみアクセスできます。

これがデータ構造です。

create or replace type animal_t as object 
  ( name varchar2(10)
    , age number (3,0))
not final;
/

create or replace type places_nt as table of varchar2(20)
/

create or replace type dog_t under animal_t
 ( residence_history places_nt)
/

create table animals of animal_t;

金魚のレコードを作成するには、次のようにします。

insert into animals
  values (animal_t('BOB', 7))
/

犬のレコードを作成するには、次のようにする必要があります。

insert into animals
  values (dog_t('FIDO', 12, places_nt('Balham', 'Tooting')))
/

このクエリは、一般的な列のみを選択します。

SQL> select * from animals
  2  /

NAME              AGE
---------- ----------
BOB                 7
FIDO               12

SQL>

犬に関する詳細を確認するには、レコードを関連するサブタイプにキャストする必要があります。

SQL> select treat(value(a) as dog_t)
  2  from animals a
  3  where value(a) is of (dog_t)
  4  /

TREAT(VALUE(A)ASDOG_T)(NAME, AGE, RESIDENCE_HISTORY)
--------------------------------------------------------------------------------
DOG_T('FIDO', 12, PLACES_NT('Balham', 'Tooting'))

SQL>

Oracle のドキュメントには、そのオブジェクト リレーショナル機能に特化した本が 1 冊あります。 詳細をご覧ください


注: ここでオブジェクト テーブルを使用したのは、ネストされたテーブルがどのように機能するかを簡単に説明できるようにするためです。データ ストレージに型を使用することはお勧めしません。OO はプログラミング パラダイムであり、プログラムの作成にのみ使用する必要があります。データは常にリレーショナル構造に保持する必要があります。

于 2012-12-02T16:25:27.863 に答える