HOW TO

Nutzen der st_geometry-Operatoren in Oracle PL/SQL

Last Published: April 19, 2022

Zusammenfassung

In den bereitgestellten Anweisungen wird beschrieben, wie st_geometry-Operatoren in Oracle PL/SQL (gespeicherte Prozeduren, Trigger usw.) genutzt werden.

Da die st_geometry-Funktionen als Datenbankoperatoren verfügbar gemacht und in der Regel über SQL-Anweisungen verwendet werden, ist bei Nutzung der st_geometry-Funktionalität mit PL/SQL die Referenzierung der zugrunde liegenden Funktionen erforderlich, indem die entsprechenden Paket- und Funktionsnamen vollständig qualifiziert werden.

Vorgehensweise

Wenn beispielsweise der Operator "sde st_astext" in PL/SQL genutzt werden soll, muss der Aufruf das vollständig qualifizierte Paket referenzieren, in dem sich die Funktion befindet. Die folgende Codezeile zeigt, wie die lokale Variable des Typs CLOB auf die Ausgabe der Funktion "st_astext" gesetzt wird.

local_geometry_wkt := sde.st_geometry_operators.st_astext_f(in_st_geom_feature);

Alle Geometrie-Operatoren wie "st_astext", "st_centroid", "st_numgeometries" usw. befinden sich im Paket "st_geometry_operators". Alle relationalen Operatoren, z. B. "st_intersects", "st_within", "st_contains" usw., befinden sich im Paket "st_relation_operators".

Hinweis: Wenn Sie einen st_*-Operator als Funktion referenzieren, müssen Sie daran denken, die _f-Klausel nach seinem Namen anzugeben, damit die entsprechende Funktion im Paketkörper referenziert wird.

Im folgenden Beispiel wird veranschaulicht, wie eine Oracle-Funktion erstellt wird, die einen booleschen Wert zurückgeben soll, wenn eine Eingabe-Geometrie das Attribut "st_geometry" einer anderen Tabelle schneidet. Die Funktion stellt zwei Beispielaufrufe bereit, die st_buffer und st_intersects durchführen.

CREATE OR REPLACE FUNCTION lightning_strike_f (in_shape sde.st_geometry) RETURN BOOLEAN IS TYPE env_int_cur IS REF CURSOR; env_cur env_int_cur; temp_shape sde.st_geometry := sde.st_geometry(0,0,0,0,0,0,0,0,0,0,0,0,0,empty_blob()); buffered_shape sde.st_geometry := sde.st_geometry(0,0,0,0,0,0,0,0,0,0,0,0,0,empty_blob()); entity_tab dbms_sql.number_table; numpts_tab dbms_sql.number_table; srid_tab dbms_sql.number_table; minx_tab dbms_sql.number_table; miny_tab dbms_sql.number_table; maxx_tab dbms_sql.number_table; maxy_tab dbms_sql.number_table; points_tab dbms_sql.blob_table; does_intersect BOOLEAN DEFAULT FALSE; BEGIN buffered_shape := sde.st_geometry_operators.st_buffer_f(in_shape,10); OPEN env_cur FOR 'SELECT p.shape.entity, p.shape.numpts, p.shape.minx, p.shape.miny, p.shape.maxx, p.shape.maxy, p.shape.srid, p.shape.points FROM sewer p WHERE sde.st_envintersects(p.shape,'||buffered_shape.minx||','||buffered_shape.miny||', '||buffered_shape.maxx||','||buffered_shape.maxy||') = 1'; FETCH env_cur BULK COLLECT INTO entity_tab,numpts_tab,minx_tab,miny_tab, maxx_tab,maxy_tab,srid_tab,points_tab; IF entity_tab.COUNT = 0 THEN does_intersect := FALSE; ELSE FOR i IN 1..entity_tab.COUNT LOOP temp_shape.entity := entity_tab(i); temp_shape.numpts := numpts_tab(i); temp_shape.minx := minx_tab(i); temp_shape.miny := miny_tab(i); temp_shape.maxx := maxx_tab(i); temp_shape.maxy := maxy_tab(i); temp_shape.minz := 0; temp_shape.maxz := 0; temp_shape.minm := 0; temp_shape.maxm := 0; temp_shape.area := 0; temp_shape.len := 0; temp_shape.srid := srid_tab(i); temp_shape.points := points_tab(i); IF sde.st_relation_operators.st_intersects_f(buffered_shape,temp_shape) = 1 THEN does_intersect := TRUE; EXIT; END IF; END LOOP; END IF; RETURN does_intersect; END; /
 

    Artikel-ID:000010459

    Hilfe von ArcGIS-Expert*innen erhalten

    Technischen Support kontaktieren

    Die Esri Support-App herunterladen

    Zu den Download-Optionen

    Weitere Informationen zu diesem Thema erkunden