プライマリ・コンテンツに移動
Oracle® Spatial and Graph開発者ガイド
12cリリース1 (12.1)
B72470-07
目次へ移動
目次
索引へ移動
索引

前
次

9.1 ユーザー定義型定義のSDO_GEOMETRYオブジェクト

SDO_GEOMETRY型は、ユーザー定義のデータ型定義に埋め込むことができます。その手順は、次に示すとおり、空間データ列にSDO_GEOMETRY型を使用する場合の手順に類似しています。

  1. ユーザー定義のデータ型を作成します。

  2. そのデータ型に基づいた列を含む表を作成します。

  3. その表にデータを挿入します。

  4. USER_SDO_GEOM_METADATAビューを更新します。

  5. ジオメトリ属性に対して空間索引を作成します。

  6. データに対して問合せを実行します。

たとえば、「空間データの挿入、索引付けおよび問合せの例」の例に示すコーラのマーケットの例に従って、マーケット名属性およびジオメトリ属性を単一の型に取り込むとします。まず、次に示すとおり、ユーザー定義のデータ型を作成します。この例では、MARKET_TYPEというオブジェクト型を作成します。

CREATE OR REPLACE TYPE market_type AS OBJECT 
  (name VARCHAR2(32), shape SDO_GEOMETRY);
/

そのユーザー定義型に基づいた列を含む表を作成します。次の例では、「空間データの挿入、索引付けおよび問合せの例」の例で使用されているCOLA_MARKETS表と同じ情報を含むCOLA_MARKETS_2という表を作成します。

CREATE TABLE cola_markets_2 (
  mkt_id NUMBER PRIMARY KEY,
  market MARKET_TYPE);

オブジェクト型名をコンストラクタとして使用して、その表にデータを挿入します。次に例を示します。

INSERT INTO cola_markets_2 VALUES(
  1,
  MARKET_TYPE('cola_a',
    SDO_GEOMETRY(
      2003,  -- two-dimensional polygon
      NULL,
      NULL,
      SDO_ELEM_INFO_ARRAY(1,1003,3), -- one rectangle (1003 = exterior)
      SDO_ORDINATE_ARRAY(1,1, 5,7) -- only 2 points needed to
            -- define rectangle (lower left and upper right)
      )
  )
);

ドット表記法を使用して列名および空間属性を指定し、USER_SDO_GEOM_METADATAビューを更新します。次の例では、MARKET.SHAPEをこのメタデータ・ビューのCOLUMN_NAME(「COLUMN_NAME」を参照)として指定します。

INSERT INTO user_sdo_geom_metadata
    (TABLE_NAME,
     COLUMN_NAME,
     DIMINFO,
     SRID)
  VALUES (
  'cola_markets_2',
  'market.shape',
  SDO_DIM_ARRAY(   -- 20X20 grid
    SDO_DIM_ELEMENT('X', 0, 20, 0.005),
    SDO_DIM_ELEMENT('Y', 0, 20, 0.005)
     ),
  NULL   -- SRID
);

ドット表記法を使用して列名および空間属性を指定し、空間索引を作成します。次に例を示します。

CREATE INDEX cola_spatial_idx_2
ON cola_markets_2(market.shape)
INDEXTYPE IS MDSYS.SPATIAL_INDEX;

ドット表記法を使用してユーザー定義型の属性を参照し、データに対する問合せを実行します。次の単純な問合せは、cola_aというコーラのマーケットに関連する情報を戻します。

SELECT c.mkt_id, c.market.name, c.market.shape 
  FROM cola_markets_2 c
  WHERE c.market.name = 'cola_a';

次の問合せは、指定した問合せウィンドウ(左下の座標に(4,6)、右上の座標に(8,8)を持つ矩形)と空間的に相互作用するすべてのジオメトリに関連する情報を戻します。

SELECT c.mkt_id, c.market.name, c.market.shape
  FROM cola_markets_2 c
  WHERE SDO_RELATE(c.market.shape,
            SDO_GEOMETRY(2003, NULL, NULL,
              SDO_ELEM_INFO_ARRAY(1,1003,3),
              SDO_ORDINATE_ARRAY(4,6, 8,8)),
            'mask=anyinteract' = 'TRUE';