[201] | 1 | CREATE OR REPLACE TRIGGER delete_feature_trigger |
---|
| 2 | BEFORE INSERT ON "DELETE" |
---|
| 3 | FOR EACH ROW |
---|
| 4 | DECLARE |
---|
| 5 | query varchar2(2047); |
---|
| 6 | begsql varchar2(2047); |
---|
| 7 | aktbeg varchar2(2047); |
---|
| 8 | gml_id varchar2(2047); |
---|
| 9 | BEGIN |
---|
[209] | 10 | :NEW.typename := upper(substr(:NEW.typename,1,30)); |
---|
[201] | 11 | :NEW.context := lower(:NEW.context); |
---|
| 12 | gml_id := substr(:NEW.featureid, 1, 16); |
---|
| 13 | |
---|
| 14 | IF :NEW.context IS NULL THEN |
---|
| 15 | :NEW.context := 'delete'; |
---|
| 16 | END IF; |
---|
| 17 | |
---|
| 18 | IF :NEW.context='delete' THEN |
---|
| 19 | -- ersatzloses Loeschen eines Objektes |
---|
| 20 | |
---|
| 21 | query := 'DELETE FROM ' || :NEW.typename |
---|
| 22 | || ' WHERE gml_id = ''' || gml_id || ''''; |
---|
| 23 | EXECUTE IMMEDIATE query; |
---|
| 24 | |
---|
| 25 | query := 'DELETE FROM alkis_beziehungen WHERE beziehung_von = ''' || gml_id |
---|
| 26 | || ''' OR beziehung_zu = ''' || gml_id || ''''; |
---|
| 27 | EXECUTE IMMEDIATE query; |
---|
| 28 | |
---|
| 29 | dbms_output.put_line( 'Lösche gml_id '|| gml_id || ' in ' || :NEW.typename || ' und Beziehungen'); |
---|
| 30 | |
---|
| 31 | ELSE |
---|
| 32 | -- Ersetzen eines Objektes |
---|
| 33 | -- In der objekt-Tabelle sind bereits 2 Objekte vorhanden (alt und neu). |
---|
| 34 | -- Die 2 DatensÀtze unterscheiden sich nur in ogc_fid und beginnt |
---|
| 35 | |
---|
| 36 | -- beginnt-Wert des aktuellen Objektes ermitteln |
---|
| 37 | -- RAISE NOTICE 'Suche beginnt von neuem gml_id % ', substr(:NEW.replacedBy, 1, 16); |
---|
| 38 | begsql := 'SELECT max(beginnt) FROM ' || :NEW.typename || ' WHERE gml_id = ''' || substr(:NEW.replacedBy, 1, 16) || ''' AND endet IS NULL'; |
---|
| 39 | EXECUTE IMMEDIATE begsql INTO aktbeg; |
---|
| 40 | |
---|
| 41 | -- Nur alte Objekte entfernen |
---|
| 42 | query := 'DELETE FROM ' || :NEW.typename || ' WHERE gml_id = ''' || gml_id || ''' AND beginnt < ''' || aktbeg || ''''; |
---|
| 43 | EXECUTE IMMEDIATE query; |
---|
| 44 | |
---|
| 45 | -- Tabelle alkis_beziehungen |
---|
| 46 | IF gml_id <> substr(:NEW.replacedBy, 1, 16) THEN -- gml_id gleich |
---|
| 47 | -- replace mit ungleicher gml_id |
---|
| 48 | -- Falls dies vorkommt, die Function erweitern |
---|
| 49 | raise_application_error(-20100, gml_id || ': neue gml_id ' || :NEW.replacedBy || ' bei Replace in ' || :NEW.typename || '. alkis_beziehungen muss aktualisiert werden!'); |
---|
| 50 | -- ELSE |
---|
| 51 | -- Beziehungen des Objektes wurden redundant noch einmal eingetragen |
---|
| 52 | -- ToDo: HIER sofort die Redundanzen zum aktuellen Objekt beseitigen. |
---|
| 53 | -- Workaround: Nach der Konvertierung werden im Post-Processing |
---|
| 54 | -- ALLE Redundanzen mit einem SQL-Statemant beseitigt. |
---|
| 55 | -- RAISE NOTICE 'Ersetze gleiche gml_id % in %', gml_id, :NEW.typename; |
---|
| 56 | |
---|
| 57 | -- ENTWURF ungetestet: |
---|
| 58 | --query := 'DELETE FROM alkis_beziehungen AS bezalt |
---|
| 59 | -- WHERE (bezalt.beziehung_von = ' || gml_id || ' OR bezalt.beziehung_zu = ' || gml_id ||') |
---|
| 60 | -- AND EXISTS (SELECT ogc_fid FROM alkis_beziehungen AS bezneu |
---|
| 61 | -- WHERE bezalt.beziehung_von = bezneu.beziehung_von |
---|
| 62 | -- AND bezalt.beziehung_zu = bezneu.beziehung_zu |
---|
| 63 | -- AND bezalt.beziehungsart = bezneu.beziehungsart |
---|
| 64 | -- AND bezalt.ogc_fid < bezneu.ogc_fid);' |
---|
| 65 | --EXECUTE query; |
---|
| 66 | |
---|
| 67 | END IF; |
---|
| 68 | END IF; |
---|
| 69 | |
---|
| 70 | :NEW.ignored := 'false'; |
---|
| 71 | END delete_feature_trigger; |
---|
| 72 | / |
---|
| 73 | |
---|
[209] | 74 | -- show errors trigger delete_feature_trigger; |
---|
[201] | 75 | |
---|
| 76 | QUIT; |
---|
| 77 | |
---|