[FOSSGIS-Talk] QGIS und ORACL-Datenbank
Peter K.
webentry at web.de
Do Nov 4 10:38:17 CET 2021
Hallo Thomas,
ich konnte jetzt mal den verwendeten Trigger sehen, dort steht folgendes:
>>>>>>>>>>>>>
BEGIN
select diminfo into oDimInfo from user sdo_geom_metadata where (table_name =
'FL_NUTZUNG') and (column_name = 'GEOMETRIE');
vIdText := nvl (:old.ID, -999999). || '/' || nvl(:new.ID, -999999);
-- oDimInfo := MDSYS.SDO_DIM_ARRAY(MDSYS.SDO_DIM_ELEMENT('X'), -2147483648,
2147483647, 0.000005), MDSYS.SDO_DIM_ELEMENT('Y', -2147483648, 2147483647,
0.000005), null, null);
if inserting then
if :new.ID is null then
vErrorText := 'Primärschlüssel nicht gesetzt!';
raise eError;
end if;
if :new.GEOMETRIE is null then
vErrorText := 'Die Geometrieinformationen sind leer!';
raise eError;
.
...WEITERE END IF ABFRAGEN....
.
.
Wie man sieht, es fehlt "select ..._ID.nextval into NEW "ID" from dual"
Gruß Peter
Gesendet: Mittwoch, 03. November 2021 um 17:45 Uhr
Von: "Thomas B" <rdbath.regiodata at gmail.com>
An: "Peter K." <webentry at web.de>
Cc: "FOSSGIS" <FOSSGIS-Talk-Liste at fossgis.de>
Betreff: Re: [FOSSGIS-Talk] QGIS und ORACL-Datenbank
Hallo Peter,
anbei ein Beispiel-DDL, das bei mir ohne Probleme im Zusammenspiel mit QGIS funktioniert: https://gist.github.com/thbaumann/6f2b5da6e5f6b74f802dde7230835055
Vielleicht mal bei dir den Testlayer erzeugen und gegenprüfen. In QGIS muss man halt noch im Attributformular für die ID-Spalte die Restriktion rausnehmen, damit man speichern kann ohne Einträge in der ID-Spalte gesetzt zu haben aber wenn ich richtig gelesen habe hast du das ja getan.
Ansonsten vielleicht auch mal abseits von QGIS versuchen den Trigger anzusprechen und schauen, ob der vielleicht generell wo hängt unabhängig von QGIS?
Zu deiner Frage des Zusammenspiels von QGIS und Oracle: Ich denke der Oracle-Provider bräuchte mal etwas Pflege...gerade auch was das Erkennen der Primärschlüsselspalte angeht aber jetzt beim konkreten Beispiel kann ich da wiegesagt die Sachen speichern egal ob ich Werte eingebe oder die Sequenz ziehen lasse.
Viele Grüße,
Thomas
Am Di., 2. Nov. 2021 um 15:50 Uhr schrieb Peter K. <webentry at web.de[mailto:webentry at web.de]>:Hallo an alle und an Thomas,
leider nochmal das Thema ORACLE-DB und speziell zur automatischen Erzeugung der ID in der DB-Tabelle.
Kurz noch zur Info, im April hat Thomas u.a. diesen Tipp gegeben:
>>>>>
Zum unterschiedlichen Verhalten der QGIS-Installationen:
In QGIS selbst könnte man in der Konsole schauen, was als ORACLE_HOME und
TNS_ADMIN hinterlegt ist und ob da die tnsnames.ora angesprochen wird, die
benutzt werden sollte:
import os
print(os.environ['ORACLE_HOME'])
print(os.environ['TNS_ADMIN'])
<<<<<
Ergebnis hier zu:
print(os.environ['TNS_ADMIN']) = \\OracleConf\DATEN\pub\OracleConf\ORA
print(os.environ['ORACLE_HOME']) =
Traceback (most recent call last):
File "C:\PROGRA~1\QGIS3~1.16\apps\Python37\lib\code.py", line 90, in runcode
exec(code, self.locals)
File "<input>", line 1, in <module>
File "<string>", line 2, in <module>
File "C:\PROGRA~1\QGIS3~1.16\apps\Python37\lib\os.py", line 678, in __getitem__
raise KeyError(key) from None
KeyError: 'ORACLE_HOME'
Das nur nochmal zur Info an Thomas, hatte ich wohl damals nicht mehr erwähnt.
Nun zurück zur ID, in der verwendeten DB-Tabelle gibt es vier Spalten mit der Bedingung 'NOT NULL'.
Bei zwei Attributspalten sind diese recht einfach, und werden mit entsprechenden QGIS-Vorgaben abgearbeitet.
In die vierte DB-Spalte, 'ID-KOPIE' wird die DB-Tabellen 'ID' nochmal hinein kopiert, dies ist für die derzeitig verwendete
CAD/GIS-Anwendung wohl nötig. Auch dies wird über einen Vorgabewert in QGIS gelöst, obwohl es dafür auch
einen Trigger in der ORACLE-DB gibt.
Als Umgehungslösung wird derzeit aber auch die Erzeugung der 'ID' mit einem Eintrag im Feld 'Vorgabewert'
durchgeführt.
Eintrag: CASE WHEN "ID" is NULL THEN maximum( "ID")+1 ELSE "ID" END
Das ist natürlich keine gute Lösung.
Ist der o.g. Vorgabewert nicht gesetzt, bekomme ich diese Fehlermeldung:
>>>>>>>>>
Konnte Änderungen am Layer FL_NUTZUNG_MULTI nicht festschreiben
Fehler: FEHLER: Objekt nicht hinzugefügt.
Datenanbieterfehler:
Oracle-Fehler beim Attributhinzufügen: Oracle-Fehler: Konnte Objekt -27 nicht einfügen
SQL: ORA-20001: Primärschlüssel nicht gesetzt! Ids: -999999 / -999999
ORA-06512: in "FPLAN.FL_NUTZUNG_B_IUD", Zeile 183
ORA-04088: Fehler bei der Ausführung von Trigger 'FPLAN.FL_NUTZUNG_B_IUD'
Konnte Anweisung nicht ausführen
Fehler: INSERT INTO "FPLAN"."FL_NUTZUNG"("GEOMETRIE","ID","NUTZUNG","NUTZUNG_LV","FL_CODE","BEMERKUNG","AREA","ALTLAST","AL_NAME",
"AFM","GR_RING","BN","BRACHE","DB_FC_1","DB_FC_2","DB_FC_TEXT","KG_NR","KG_BEMERKUNG","KONTROLLE","ST_LA_SA","OS_LSA","FS_LSA",
"SO_NUTZUNG","CREATOR","CREATED","EDITOR","EDITED","ID_KOPIE","BEIPLANDARSTELLUNG","LSG","NSG","KG_RNAHME","BPLANNR","MWE",
"DB_FC_TEXT_2") VALUES (:a,:bb,:bc,:bd,:be,:bf,:bg,:bh,:bi,:bj,:bk,:bl,:bm,:bn,:bo,:bp,:cba,:cbb,:cbc,:cbd,:cbe,:cbf,:cbg,:cbh,
:cbi,:cbj,:cbk,:cbl,:cbm,:cbn,:cbo,:cbp,:cca,:ccb,:ccc)
<<<<<<<<<<
So weit nochmal der Stand hier, bei der Nutzung einer ORACLE-DB mit QGIS.
Nächste Woche gibt es ein Gespräch beim DB-Betreiber. Darum wollte ich auch mal Fragen, ob es vielleicht spezielle Punkte gibt
die Datenbankseitig für die Nutzung mit QGIS zu beachten sind. Scheinbar reagieren ja die ORACLE-Trigger nicht auf die 'QGIS'
Rückmeldungen.
So genug Text, Gruß Peter
Verwendete QGIS-Versionen: 3.16.11 und 3.18.3
--
....................................................................
FOSSGIS Veranstaltungen
https://www.fossgis.de/news/fossgis-events/[https://www.fossgis.de/news/fossgis-events/]
FOSSGIS e.V, der Verein zur Förderung von Freier Software aus dem
GIS-Bereich und Freier Geodaten!
https://www.fossgis.de/[https://www.fossgis.de/] https://twitter.com/FOSSGIS_Verein[https://twitter.com/FOSSGIS_Verein]
____________________________________________________________________
FOSSGIS-Talk-Liste mailing list
FOSSGIS-Talk-Liste at fossgis.de[mailto:FOSSGIS-Talk-Liste at fossgis.de]
https://lists.fossgis.de/mailman/listinfo/fossgis-talk-liste
Mehr Informationen über die Mailingliste FOSSGIS-Talk-Liste