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 |
---|
10 | :NEW.typename := upper(substr(:NEW.typename,1,30)); |
---|
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 | |
---|
74 | -- show errors trigger delete_feature_trigger; |
---|
75 | |
---|
76 | QUIT; |
---|
77 | |
---|