この章では、データベースに空間データをロードする方法(SDO_GEOMETRY型の列を使用した表へのデータの格納を含む)を説明します。空間データのロードの完了後、データに対して空間索引を作成し、データに対する問合せを実行できます(第5章を参照)。
データのロード処理には、次の2種類があります。
データのバルク・ロード(4.1項を参照)
大量のデータをデータベースにロードする場合は、この処理方法を使用します。データのロードには、SQL*Loaderユーティリティを使用します。
トランザクション挿入(4.2項を参照)
一般的に、この処理は比較的少量のデータをデータベースに挿入する場合に、SQLのINSERT文を使用して行われます。
空間データのロードおよび検証に関する推奨事項は、4.3項を参照してください。
バルク・ロードでは、大量のデータをOracle Databaseにインポートできます。バルク・ロードは、SQL*Loaderユーティリティを使用して実行します。 (SQL*Loaderの詳細は、『Oracle Databaseユーティリティ』を参照してください。)
例4-1は、4つのジオメトリをロードするためのSQL*Loader制御ファイルです。この制御ファイルをSQL*Loaderで使用すると、2.1項の例2-1でSQL文を使用して挿入されたコーラのマーケットのジオメトリと同じジオメトリがロードされます。
例4-1 コーラのマーケットのジオメトリをバルク・ロードするための制御ファイル
LOAD DATA INFILE * TRUNCATE CONTINUEIF NEXT(1:1) = '#' INTO TABLE COLA_MARKETS FIELDS TERMINATED BY '│' TRAILING NULLCOLS ( mkt_id INTEGER EXTERNAL, name CHAR, shape COLUMN OBJECT ( SDO_GTYPE INTEGER EXTERNAL, SDO_ELEM_INFO VARRAY TERMINATED BY '│/' (elements FLOAT EXTERNAL), SDO_ORDINATES VARRAY TERMINATED BY '│/' (ordinates FLOAT EXTERNAL) ) ) begindata 1│cola_a│ #2003│1│1003│3│/ #1│1│5│7│/ 2│cola_b│ #2003│1│1003│1│/ #5│1│8│1│8│6│5│7│5│1│/ 3│cola_c│ #2003│1│1003│1│/ #3│3│6│3│6│5│4│5│3│3│/ 4│cola_d│ #2003│1│1003│4│/ #8│7│10│9│8│11│/
例4-1では、次のことに注意してください。
mkt_id INTEGER EXTERNAL
定義内のEXTERNAL
キーワードは、MKT_ID列に挿入するそれぞれの値(この例では、1、2、3および4)がバイナリ形式ではなく、人間が判読可能な形式の整数であることを意味します。
CONTINUEIF NEXT(1:1) = '#'
指定によって、各データ行の先頭が番号記号(#)継続文字でないかぎり無視されるため、begindata
の後のデータでは、各MKT_ID値の前に空白が1つあります。
例4-2では、POLY_4PTという表を次のとおり作成したと想定しています。
CREATE TABLE POLY_4PT (GID VARCHAR2(32), GEOMETRY SDO_GEOMETRY);
ASCIIデータは、デリミタ付きの列および次の書式の表制限で固定されている別々の行で構成されているとします。
geometry rows: GID, GEOMETRY
GEOMETRY列の座標は、ポリゴンを表現しています。データをロードするための制御ファイルを例4-2に示します。
例4-2 ポリゴンのバルク・ロードのための制御ファイル
LOAD DATA INFILE * TRUNCATE CONTINUEIF NEXT(1:1) = '#' INTO TABLE POLY_4PT FIELDS TERMINATED BY '│' TRAILING NULLCOLS ( GID INTEGER EXTERNAL, GEOMETRY COLUMN OBJECT ( SDO_GTYPE INTEGER EXTERNAL, SDO_ELEM_INFO VARRAY TERMINATED BY '│/' (elements FLOAT EXTERNAL), SDO_ORDINATES VARRAY TERMINATED BY '│/' (ordinates FLOAT EXTERNAL) ) ) begindata 1│2003│1│1003│1│/ #-122.4215│37.7862│-122.422│37.7869│-122.421│37.789│-122.42│37.7866│ #-122.4215│37.7862│/ 2│2003│1│1003│1│/ #-122.4019│37.8052│-122.4027│37.8055│-122.4031│37.806│-122.4012│37.8052│ #-122.4019│37.8052│/ 3│2003│1│1003│1│/ #-122.426│37.803│-122.4242│37.8053│-122.42355│37.8044│-122.4235│37.8025│ #-122.426│37.803│/
例4-3に、点データを表にロードする制御ファイルを示します。
例4-3 点のみのデータをバルク・ロードするための制御ファイル
LOAD DATA INFILE * TRUNCATE CONTINUEIF NEXT(1:1) = '#' INTO TABLE POINT FIELDS TERMINATED BY '│' TRAILING NULLCOLS ( GID INTEGER EXTERNAL, GEOMETRY COLUMN OBJECT ( SDO_GTYPE INTEGER EXTERNAL, SDO_POINT COLUMN OBJECT (X FLOAT EXTERNAL, Y FLOAT EXTERNAL) ) ) BEGINDATA 1│ 2001│ -122.4215│ 37.7862│ 2│ 2001│ -122.4019│ 37.8052│ 3│ 2001│ -122.426│ 37.803│ 4│ 2001│ -122.4171│ 37.8034│ 5│ 2001│ -122.416151│ 37.8027228│
Oracle Spatialでは、標準SQL構文を使用してアクセスまたはロード可能な、標準のOracleの表を使用します。この項では、SDO_GEOMETRY型の列へのトランザクション挿入の例を示します。一般的に、この処理は比較的少量のデータをデータベースに追加する場合に使用されます。
Oracle SQLのINSERT文では、引数の指定は999までに制限されています。そのため、トランザクションのINSERT文でSDO_GEOMETRYコンストラクタを使用して、999要素以上の可変長配列を作成することはできません。ただし、ホスト変数を使用してジオメトリを挿入することは可能で、そのホスト変数は、SDO_ORDINATE_ARRAYに999以上の値を指定したSDO_GEOMETRYコンストラクタで作成可能です。(ホスト変数は、OCI、PL/SQLまたはJavaプログラムの変数です。)
ジオメトリを挿入するプロシージャを作成し、挿入する各ジオメトリに対してそのプロシージャをコールして、ジオメトリのトランザクション挿入を実行します。例4-4では、挿入処理を実行するプロシージャを作成します。
例4-4 トランザクション挿入処理を実行するプロシージャ
CREATE OR REPLACE PROCEDURE INSERT_GEOM(GEOM SDO_GEOMETRY) IS BEGIN INSERT INTO TEST_1 VALUES (GEOM); COMMIT; END; /
例4-4で作成したプロシージャを使用して、例4-5に示すようなPL/SQLブロック(geom
という変数にジオメトリをロードし、プロシージャINSERT_GEOMをコールしてジオメトリを挿入する)でデータを挿入できます。
例4-5 ジオメトリを挿入するプロシージャをコールするPL/SQLブロック
DECLARE geom SDO_geometry := SDO_geometry (2003, null, null, SDO_elem_info_array (1,1003,3), SDO_ordinate_array (-109,37,-102,40)); BEGIN INSERT_GEOM(geom); COMMIT; END; /
様々なジオメトリ・タイプを使用したその他の例については、次の例を参照してください。
空間データをロードおよび検証するための推奨手順は、次のとおりです。
データベースにロードされたすべての空間データに対して、SDO_GEOM.VALIDATE_GEOMETRY_WITH_CONTEXTファンクションまたはSDO_GEOM.VALIDATE_LAYER_WITH_CONTEXTプロシージャを使用します。
無効な方向や無効なETYPE値またはGTYPE値を持つジオメトリに対して、SDO_MIGRATE.TO_CURRENTを使用してこれらの無効なジオメトリを修正します。
その他の理由で無効になっているジオメトリについては、SDO_UTIL.RECTIFY_GEOMETRYを使用して修正します。
これらのサブプログラムの使用方法の詳細は、そのリファレンス情報を示す項にある使用上の注意を参照してください。