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.
 
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öschenVielen 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öschenHier sind ein paar nützliche Abfragen auf Views zu SDO_GEOMETRY:
AntwortenLöschen-- 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;