4 空間データのロード
この章では、データベースに空間データをロードする方法(SDO_GEOMETRY型の列を使用した表へのデータの格納を含む)を説明します。
空間データのロードの完了後、データに対して空間索引を作成し、データに対する問合せを実行できます。
データのロード処理には、次の2種類があります。
-
データのバルク・ロード
大量のデータをデータベースにロードする場合は、この処理方法を使用します。データのロードには、SQL*Loaderユーティリティを使用します。
-
トランザクション挿入操作
一般的に、この処理は比較的少量のデータをデータベースに挿入する場合に、SQLのINSERT文を使用して行われます。
- バルク・ロード
バルク・ロードでは、大量のデータをOracle Databaseにインポートできます。 - SQLを使用したトランザクション挿入
Oracle Spatial and Graphでは、標準SQL構文を使用してアクセスまたはロード可能な、Oracleの標準の表を使用します。このトピックでは、SDO_GEOMETRY型の列へのトランザクション挿入の例を示します。一般的に、この処理は比較的少量のデータをデータベースに追加する場合に使用されます。 - 空間データのロードおよび検査の推奨手順
データで空間操作を実行する前に、すべてのジオメトリ・データを検査し、検査エラーがあれば修正する必要があります。
親トピック: 概要および使用情報
4.1 バルク・ロード
バルク・ロードでは、大量のデータをOracle Databaseにインポートできます。
バルク・ロードは、SQL*Loaderユーティリティを使用して実行します。(SQL*Loaderの詳細は、『Oracle Databaseユーティリティ』を参照してください。)
4.1.1 SDO_GEOMETRYオブジェクトのバルク・ロード
例4-1は、4つのジオメトリをロードするためのSQL*Loader制御ファイルです。この制御ファイルをSQL*Loaderで使用すると、「空間データの挿入、索引付けおよび問合せの例」で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 ポリゴンのバルク・ロードのための制御ファイル
例4-2では、POLY_4PTという表を次のとおり作成したと想定しています。
CREATE TABLE POLY_4PT (GID VARCHAR2(32), GEOMETRY SDO_GEOMETRY);
ASCIIデータは、デリミタ付きの列および次の書式の表制限で固定されている別々の行で構成されているとします。
geometry rows: GID, GEOMETRY
GEOMETRY列の座標は、ポリゴンを表現しています。データをロードするための制御ファイルを例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.1.2 SDO_GEOMETRYオブジェクトの点のみのデータのバルク・ロード
例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|
親トピック: バルク・ロード
4.2 SQLを使用したトランザクション挿入
Oracle Spatial and Graphでは、標準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.3 空間データのロードおよび検査の推奨手順
データで空間操作を実行する前に、すべてのジオメトリ・データを検査し、検査エラーがあれば修正する必要があります。
空間データをロードおよび検証するための推奨手順は、次のとおりです。
- 「バルク・ロード」または「SQLを使用したトランザクション挿入」に示す方法でデータをロードします。
- データベースにロードされたすべての空間データに対して、SDO_GEOM.VALIDATE_GEOMETRY_WITH_CONTEXTファンクションまたはSDO_GEOM.VALIDATE_LAYER_WITH_CONTEXTプロシージャを使用します。
- 無効な方向や無効なETYPE値またはGTYPE値を持つジオメトリに対して、SDO_MIGRATE.TO_CURRENTを使用してこれらの無効なジオメトリを修正します。
- その他の理由で無効になっているジオメトリについては、SDO_UTIL.RECTIFY_GEOMETRYを使用して修正します。
これらのサブプログラムの使用上のノートの詳細は、そのリファレンス情報を示す項にある使用上のノートを参照してください。
親トピック: 空間データのロード