Freitag, 12. November 2010

Views mit SDO_GEOMETRY

Auch für Geodaten-Tabellen werden recht häufig Views generiert. Daten aus verschiedenen Tabellen stehen damit quasi als "eine Tabelle" bereit. Und man kann mit den Views auch sehr gut arbeiten. Nur lassen sich die Views von vielen GIS-Werkzeugen und auch vom Oracle MapBuilder (das Werkzeug zum Einrichten der Kartendefinitionen für Oracle MAPS) nicht verwenden - die Auswahldialoge zeigen sie einfach nicht an.
Nun befindet sich auf der View zwar kein Spatial-Index, aber das ist ja auch richtig so; auf eine View kann kein Index gelegt werden. Der Grund ist die Spatial-Metadaten-View USER_SDO_GEOM_METADATA, die von all diesen Werkzeugen ausgelesen wird und meist Grundlage der Auswahllisten ist.
Die Lösung ist also einfach: Die View wird, wie die zugrundeliegende Spatial-Tabelle in USER_SDO_GEOM_METADATA eingetragen. Nehmt einfach dieses SQL hier als Vorlage.
insert into user_sdo_geom_metadata values (
  '{TABLE/VIEW NAME}',
  '{GEOM_COL_NAME}',
  sdo_dim_array(
   sdo_dim_element('X', {xmin}, {xmax}, {tolerance}),
   sdo_dim_element('Y', {ymin}, {ymax}, {tolerance})
  ),
  {SRID}
)
/
Einen Index könnt Ihr danach immer noch nicht anlegen - aber das braucht Ihr auch nicht - der View sollte nun in eurem GIS-Werkzeug oder im Oracle MapBuilder sicht- und auswählbar sein.

3 Kommentare:

  1. Sollte die View von einem anderen User benutzt werden, muss diese View auch für diesen User in den GDOSYS Metadaten eingetragen werden. Weiter benötigt dieser Benutzer das MERGE ANY VIEW Recht, da ansonsten der räumliche Index bei Zugriffen nicht genutzt werden kann. So können enorme Performance Probleme entstehen!!

    AntwortenLöschen
  2. Vielen Dank für den Hinweis. Natürlich muss der Nutzername in den MDSYS-Metadaten angegeben werden, sofern auf eine in einem anderen Schema liegende SDO_GEOMETRY Tabelle verwiesen wird.

    AntwortenLöschen
  3. Hier sind ein paar nützliche Abfragen auf Views zu SDO_GEOMETRY:

    -- Alle Tabelle mit SDO_GEOMETRY-Spalten (in einem Schema)
    select table_name, column_name
    from user_tab_columns
    where data_type = 'SDO_GEOMETRY'
    order by 1,2;

    -- Tabellen mit SDO_GEOMETRY-Spalten, für die keine Metadaten registiert sind:
    select table_name, column_name
    from user_tab_columns
    where data_type = 'SDO_GEOMETRY'
    order by 1,2;

    -- Tabellen mit SDO_GEOMETRY-Spalten, auf denen keine Spatial Indexes angelegt wurden
    select table_name, column_name
    from user_tab_columns
    where data_type = 'SDO_GEOMETRY'
    and (table_name, column_name) not in (
    select table_name, column_name
    from user_sdo_index_info)
    order by table_name, column_name;

    -- Invalide Spatial Indexes
    select table_name, index_name
    from user_indexes
    where index_type = 'DOMAIN'
    and ityp_name = 'SPATIAL_INDEX'
    and domidx_opstatus = 'FAILED'
    order by table_name, index_name;

    AntwortenLöschen