Tworzenie warstwy w bazie danych Oracle

Dlaczego po utworzeniu nowej warstwy w bazie danych Oracle poprzez PPM na schemat w połączeniu z bazą → Nowa tabela... dostaję komunikat, że tabela została pomyślnie utworzona, a tabela/warstwa nadal nie jest widoczna w Przeglądarce na liście warstw w bazie?

W WarstwaZarządzanie źródłami danych typ geometrii i układ współrzędnych są nierozpoznane, muszę je wybrać z listy i dopiero wtedy mogę dodać warstwę do projektu. (W tym przykładzie jest to warstwa punktowa w układzie EPSG:3857).

Ale nawet wtedy po dodaniu warstwy dostaję komunikat o niepoprawnym typie geometrii (chociaż to może wynikać z tego, że w tym momencie warstwa jest pusta):
image

Mimo tych komunikatów warstwa została dodana do tabeli USER_SDO_GEOM_METADATA, a podczas edycji punkty o SDO_GTYPE=2001 dodają się bez problemu.

Dlaczego QGIS nie rozpoznaje typu geometrii i układu, które sam nadał? Czy ktoś spotkał się z tego typu komunikatami podczas pracy z warstwami w bazie danych Oracle? Jakie ogólnie macie doświadczenia w pracy z połączeniem QGIS-Oracle?

Najpierw ustalmy gdzie jesteśmy:

  1. podłącz się do tych danych z poziomu klienta - ja używam DBeaver Community Edition
  2. sprawdź czy dane tam są i czy jesteś w stanie na tej bazie wykonać jakiekolwiek operacje używając tych samych poświadczeń co QGIS

Kilka tropów, które rzucają się w oczy w Twoim opisie:

  1. Pusta warstwa i gtype – QGIS przy pobieraniu typu geometrii pyta bazę: „pokaż mi, co masz w GEOM”. Jeśli tabela jest pusta, zapytanie SELECT DISTINCT sdo_gtype … WHERE GEOM IS NOT NULL zwraca pusty zbiór, więc QGIS nie wie, co tam siedzi i wyrzuca ostrzeżenie. Oracle dopiero po dodaniu rekordu „wie”, że faktycznie będzie to np. punkt 2001.
  2. USER_SDO_GEOM_METADATA – wpis pojawił się, to dobrze. Ale QGIS potrafi być kapryśny, jeśli:
  3. SRID w tym wpisie nie ma swojego odpowiednika w MDSYS.CS_SRS (np. EPSG:3857 nie zawsze jest obecny w Oracle, czasem trzeba go ręcznie dodać).
  4. kolumna DIMINFO nie ma poprawnych min/max i tolerancji – QGIS potrafi wtedy traktować SRID jako „nierozpoznany”.
  5. Klucz główny – QGIS lubi mieć jednoznaczny identyfikator, a jeśli go nie znajdzie, łapie się ROWID. To nie musi przeszkadzać, ale komunikat wygląda groźnie.
  6. Nowa tabela z QGIS – kreator potrafi utworzyć tabelę, ale czasem z minimalnym zestawem metadanych. Oracle wymaga, żeby definicja geometrii i SRID były wpisane w kilku miejscach, a QGIS nie zawsze robi to w 100% zgodnie ze sztuką.

Na Twoim miejscu spróbowałbym:

  1. Upewnić się, że w MDSYS.CS_SRS masz wpis dla 3857 (Oracle często ma 8307, 4326, ale 3857 czasem brakuje).
  2. Wstawić jeden punkt testowy przed odświeżeniem w QGIS – wtedy QGIS powinien już rozpoznać typ geometrii.
  3. Opcjonalnie dodać klucz główny (np. kolumna ID z sekwencją).

Co do doświadczeń: QGIS z Oracle działa, ale nie jest tak bezproblemowy jak z PostGIS. Najczęściej spotykane trudności to:

  1. brak SRID w Oracle: QGIS „nie zna” układu,
  2. problemy z pustymi tabelami: dopiero pierwszy insert rozwiązuje sprawę,
  3. różne komunikaty ostrzegawcze, które niekoniecznie blokują pracę, ale straszą na starcie :wink:
1 polubienie

Bardzo dziękuję za odpowiedź. Zastanawiałam się, czy znajdzie się ktokolwiek z doświadczeniem w używaniu Oracle i QGISa, bo to raczej nie jest popularne połączenie. (Żadnemu gisowcowi tego nie życzę :upside_down_face: A jak dodamy do tej mieszanki ArcGISa to mamy drogę przez mękę heh).

Oczywistości:

  1. też używam DBeavera; mam jeszcze do dyspozycji SQLDevelopera
  2. dane są, mogę wykonywać różne operacje na tych samych poświadczeniach co w QGIS-ie (tzn. w granicach uprawnień schematu)

Pozostałe punkty wiele wyjaśniają, ale odniosę sie jeszcze do kwestii układu współrzędnych, bo…

Po pierwsze chciałam z poziomu QGIS-a utworzyć tabelę w układzie 2178, ale chyba coś nie gra w komunikacji QGIS-Oracle, bo Oracle stwierdził, że nie odnaleziono tego układu współrzędnych. Próba dodania wpisu do SDO_COORD_REF_SYSTEM nie powiodła się, bo na używanych poświadczeniach nie mogę edytować systemowych tabel (mogę edytować tylko tabele w schemacie, z którym się łączę i tabele USER).

Ale dlaczego Oracle zgłosił błąd, że nie odnaleziono układu 2178, skoro jest zarówno w tabeli MDSYS.CS_SRS, jak i MDSYS.SDO_COORD_REF_SYSTEM (i nie jest wpisany pod innym numerem id tak jak np. 4326-8307)?

Tworząc tabelę za pomocą SQL-a i uzupełniając metadane nie ma problemu z układem (zasięg powinien być ok, bo został wzięty z innych działających warstw):

Natomiast w QGISie powtarza się historia, że warstwy nie widać na liście tabel w Przeglądarce - nadal trzeba podpowiedzieć QGIS-owi poprzez Zarządzanie źródłami danych jaki układ ma warstwa, chociaż teoretycznie byłby w stanie pozyskać tę informację. (W tym momencie tabela nie posiada zdefiniowanego typu geometrii, więc tutaj rzeczywiście nie ma skąd wziąć informacji jaki to typ).

Czy powodem, dla którego układ 2178 wybrany w kreatorze w QGISie są różne definicje między QGIS-em a Oraclem?

Czy w takim przypadku SRID nie byłby unikalnym identyfikatorem rozróżniającym układy współrzędnych w Oracle? (Dodanie definicji układu z Oracle jako nowy układ współrzędnych użytkownika w QGIS-ie niczego nie rozwiązuje.)

Dopytam jeszcze o dodanie klucza głównego. O ile tworząc tabelę z poziomu QGIS-a w PostGIS-ie sekwencja dodaje się automatycznie, to w tabeli w Oracle chyba trzeba utworzyć sekwencję po stronie bazy pisząc odpowiednie zapytanie SQL?