構文(SDO_AGGRパッケージのファンクションとして)
SDO_AGGR.SDO_AGGR_SET_UNION( geometry SDO_GEOMETRY_ARRAY, tol NUMBER ) RETURN SDO_GEOMETRY;
または
SDO_AGGR.SDO_AGGR_SET_UNION( cur SYS_REFCURSOR, tol NUMBER ) RETURN SDO_GEOMETRY;
構文(空間集計ファンクションとして[非推奨])
SDO_AGGR_SET_UNION( geometry SDO_GEOMETRY_ARRAY, tol NUMBER ) RETURN SDO_GEOMETRY;
説明
SDO_GEOMETRYオブジェクトの入力VARRAYまたはREFカーソルからすべてのジオメトリ・オブジェクトの集計和集合を戻します。
パラメータ
SDO_GEOMETRY_ARRAYオブジェクト型のジオメトリ・オブジェクトの配列で、VARRAY OF SDO_GEOMETRY
として定義されます。
ジオメトリ・オブジェクトを戻すREFカーソルは、すべてのジオメトリ・オブジェクトの集計和集合を戻します。
許容差(「許容差」を参照)。
使用上の注意
注意:
Oracle Database Release 12c (12.1)では、空間集計ファンクションとしての形式は非推奨となり、次回のメジャー・リリースで削除されます。
かわりに、SDO_AGGR.SDO_AGGR_SET_UNIONファンクションの形式のいずれかを使用できます。
SDO_AGGR_SET_UNIONは、SDO_AGGR_UNIONよりパフォーマンスは高速になりますが柔軟性は低下するので、SDO_AGGR_SET_UNIONは、パフォーマンスが特に重要で、必要な機能を満たす場合にのみ使用を考えてください。
SDO_AGGR_UNIONは、SQLの集計ファンクションなので非常に柔軟であり、複雑なSQL GROUP BY句と使用できます。ただし、SDO_AGGR_SET_UNIONはSDO_AGGR_UNIONより格段に高速です。SDO_AGGR_SET_UNIONは、グループ化されるジオメトリがコレクションに容易に集合できる場合に有効です(SDO_GEOMETRYオブジェクトのVARRAYなど)。
SDO_AGGR_SET_UNION:
重なっているポリゴンのセットは集計できません。重なっているポリゴンの場合は、SDO_AGGR_UNIONを使用します。
接しているポリゴンも含めて重なっていないポリゴンのセットは効率的に集計できます。
重なっている場合でも線と点のセットを集計できます。
例
次の例では、ジオメトリ・セットを作成してSDO_AGGR_SET_UNIONに渡す汎用ルーチンが作成されます。このルーチンは入力として表名、列名および適用する条件(オプション)を受け取り、SDO_AGGR_SET_UNIONで使用可能なSDO_GEOMETRY_ARRAYを戻します。get_geom_set
ファンクション作成の後の1つ目のSELECT文は、SDO_AGGR.SDO_AGGR_UNION PL/SQLファンクションをコールします。2つ目のSELECT文は、非推奨の空間集計ファンクションをコールし、3つ目のSELECT文は、カーソルを指定する形式を使用してSDO_AGGR.SDO_AGGR_UNION PL/SQLファンクションをコールします。すべてのSELECT文は、同じ結果を戻します。(例では、「空間データの挿入、索引付けおよび問合せの例」の定義およびデータを使用しています。)
CREATE OR REPLACE FUNCTION get_geom_set (table_name VARCHAR2, column_name VARCHAR2, predicate VARCHAR2 := NULL) RETURN SDO_GEOMETRY_ARRAY DETERMINISTIC AS type cursor_type is REF CURSOR; query_crs cursor_type ; g SDO_GEOMETRY; GeometryArr SDO_GEOMETRY_ARRAY; where_clause VARCHAR2(2000); BEGIN IF predicate IS NULL THEN where_clause := NULL; ELSE where_clause := ' WHERE '; END IF; GeometryArr := SDO_GEOMETRY_ARRAY(); OPEN query_crs FOR ' SELECT ' || column_name || ' FROM ' || table_name || where_clause || predicate; LOOP FETCH query_crs into g; EXIT when query_crs%NOTFOUND ; GeometryArr.extend; GeometryArr(GeometryArr.count) := g; END LOOP; RETURN GeometryArr; END; / -- Call SDO_AGGR_SET_UNION function in SDO_AGGR PL/SQL package. SELECT sdo_aggr.sdo_aggr_set_union (get_geom_set ('COLA_MARKETS', 'SHAPE', 'name <> ''cola_c'''), .0005 ) FROM dual; SDO_AGGR.SDO_AGGR_SET_UNION(GET_GEOM_SET('COLA_MARKETS','SHAPE','NAME<>''COLA_C' -------------------------------------------------------------------------------- SDO_GEOMETRY(2007, NULL, NULL, SDO_ELEM_INFO_ARRAY(1, 1003, 2, 11, 1003, 1), SDO _ORDINATE_ARRAY(8, 11, 6, 9, 8, 7, 10, 9, 8, 11, 1, 7, 1, 1, 5, 1, 8, 1, 8, 6, 5 , 7, 1, 7)) -- CALL SDO_AGGR_SET_UNION spatial aggregate function (deprecated format). SELECT sdo_aggr_set_union (get_geom_set ('COLA_MARKETS', 'SHAPE', 'name <> ''cola_c'''), .0005 ) FROM dual; SDO_AGGR.SDO_AGGR_SET_UNION(GET_GEOM_SET('COLA_MARKETS','SHAPE','NAME<>''COLA_C' -------------------------------------------------------------------------------- SDO_GEOMETRY(2007, NULL, NULL, SDO_ELEM_INFO_ARRAY(1, 1003, 2, 11, 1003, 1), SDO _ORDINATE_ARRAY(8, 11, 6, 9, 8, 7, 10, 9, 8, 11, 1, 7, 1, 1, 5, 1, 8, 1, 8, 6, 5 , 7, 1, 7)) -- Call SDO_AGGR_SET_UNION function in SDO_AGGR PL/SQL package; specify -- a cursor as input. SELECT sdo_aggr.sdo_aggr_set_union (CURSOR(SELECT shape FROM COLA_MARKETS WHERE name <> 'cola_c'), .0005 ) FROM dual; SDO_AGGR.SDO_AGGR_SET_UNION(CURSOR(SELECTSHAPEFROMCOLA_MARKETSWHERENAME<>'COLA_C -------------------------------------------------------------------------------- SDO_GEOMETRY(2007, NULL, NULL, SDO_ELEM_INFO_ARRAY(1, 1003, 2, 11, 1003, 1), SDO _ORDINATE_ARRAY(8, 11, 6, 9, 8, 7, 10, 9, 8, 11, 1, 7, 1, 1, 5, 1, 8, 1, 8, 6, 5 , 7, 1, 7))