書式
SDO_POINTINPOLYGON(cur, geom_obj, tol, params) RETURN ANYDATASET;
説明
1番目の列が点のx座標の値で、2番目の列が点のy座標の値である一連の行を使用して、指定したポリゴン・ジオメトリ内のこれらの行を戻します。
キーワードおよびパラメータ
値 | 説明 |
---|---|
cur |
REFカーソル: ref_cursorのSQLのSELECTにある最初の2列は、ユーザー表のX点座標とY点座標である必要があります。その2列はNUMBER型である必要があります。(その他の列は、数値型、文字型および日付型の場合があります)。データ型はSYS_REFCURSORです。 |
geom_obj |
空間ポリゴンのジオメトリ・オブジェクト: 表のポリゴン・ジオメトリか、ポリゴン・ジオメトリの一時的なインスタンスのどちらかで、 |
tol |
許容差(「許容差」を参照)。0.0より大きい値を指定する必要があります。データ型はNUMBERです。 |
params |
キーワードと値を指定する、オプションのパラメータ文字列です。演算子の処理を指定します。使用可能なキーワードについては、「使用上の注意」の表18-5を参照してください。データ型はVARCHAR2です。デフォルトはNULLです。 |
戻り値
SDO_POINTINPOLYGONは、ANYDATASET TYPEのオブジェクトを戻します(Oracle Database PL/SQLパッケージおよびタイプ・リファレンスを参照)。ANYDATASETの出力列は、cur
パラメータで指定されたものになります。
使用上の注意
厳密には、SDO_POINTINPOLYGONは演算子ではなくテーブル・ファンクションです。(テーブル・ファンクションについては、『Oracle Database PL/SQL言語リファレンス』を参照してください。)ただし、使用方法が演算子に類似し、他のファンクションおよびプロシージャと同じパッケージに同梱されていないため、空間演算子の章で説明しています。
cur
パラメータで使用されるSQL文では、WHERE句に任意の数の条件を指定できます。結果の行をSDO_POINTINPOLYGON演算子に渡す前に、この機能を使用して他の属性でデータをフィルタできます。
出力列は入力列と同一ですが、戻された行のみが選択基準に一致したものになります。
表18-5に、params
パラメータのキーワードを示します。
18-5 SDO_POINTINPOLYGON演算子のparamsキーワード
パラレル問合せサーバーを使用するには、次のいずれかを実行します。
/*+ PARALLEL(
<table alias>, <n>
) */
オプティマイザ・ヒントを指定します。<table_alias>は、指定された表の別名で、<n>は並列度です。
適切な権限のアカウントで次のコマンドを入力し、パラレル問合せの実行を有効にします。
ALTER SESSION FORCE PARALLEL QUERY;
例
次の例では、COLA_MARKETS表のデータに基づいて、COLA_MARKET_POINTSという新しい表を作成します(「空間データの挿入、索引付けおよび問合せの例」 および図2-1を参照)。次に、MKT_ID列の値が1より大きい各ジオメトリ内の点を選択します。(SDO_UTIL.INTERIOR_POINTファンクションを使用して、問合せ条件に一致する各ジオメトリ内に存在する点を取得します。)
-- Create a new table with a different name based on the data from the -- COLA_MARKETS table. This table has four columns: X, Y, MKT_ID, and NAME. CREATE TABLE cola_market_points AS SELECT a.point.sdo_point.x X, a.point.sdo_point.y Y, MKT_ID, NAME FROM ( SELECT mkt_id, name, sdo_util.interior_point(shape) point FROM cola_markets) a; -- Limit to MKT_ID > 1. Also, use the PARALLEL hint. SELECT /*+ PARALLEL(a, 4) */ * FROM TABLE(sdo_PointInPolygon( CURSOR(select * from cola_market_points where mkt_id > 1), SDO_GEOMETRY( 2003, NULL, NULL, MDSYS.SDO_ELEM_INFO_ARRAY(1, 1003, 1), MDSYS.SDO_ORDINATE_ARRAY(1, 1, 8, 1, 8, 6, 5, 7, 1, 1)), 0.05)) a; X Y MKT_ID NAME ---------- ---------- ---------- -------------------------------- 6.3125 2.875 2 cola_b 4.6875 3.875 3 cola_c
次の例はWHERE句でバインド変数を使用して、params
文字列を指定します。PIP_DATAという名前の表が存在すると想定しています。
DECLARE my_cursor SYS_REFCURSOR; my_pip_cursor SYS_REFCURSOR; stmt varchar2(2000); cnt number; BEGIN stmt := 'SELECT count(*) FROM ' || ' TABLE (Sdo_PointInPolygon(' || 'CURSOR(select * from pip_data where x < :x1),' || ' :g1, :tol, ''mask=DISJOINT sdo_batch_size=6000'')) '; open my_cursor for stmt using 100, -- :x1 SDO_GEOMETRY( 2003, NULL, NULL, SDO_ELEM_INFO_ARRAY(1, 1003, 1), SDO_ORDINATE_ARRAY(10, 10, 70,10, 70, 70, 50,70, 40,50, 20,70, 10,70, 10,10)), -- :g1 0.05; -- :tol FETCH my_cursor into cnt; dbms_output.put_line(to_char(cnt)); END; /