source: trunk/data/konvert/postnas_0.7/alkis-trigger-hist-oracle.sql @ 209

Revision 209, 4.6 KB checked in by j.e.fischer, 11 years ago (diff)

Oracle-Fixes:

  • Trigger: Einträge in "DELETE".typename auf 30 Zeichen kürzen
  • pg-to-oci.pl: Kommentare zu PostGIS-Metatabellen überspringen

Schemaänderungen:

  • weitere Kommentare zu neuen Tabellen ergänzt
Line 
1BEGIN EXECUTE IMMEDIATE 'DROP TABLE alkis_beziehungen_insert CASCADE CONSTRAINTS'; EXCEPTION WHEN OTHERS THEN NULL; END;
2/
3
4CREATE TABLE alkis_beziehungen_insert(
5        ogr_fid                 integer NOT NULL,
6        beziehung_von           character(16),
7        beziehungsart           varchar2(2047),
8        beziehung_zu            character(16),
9        CONSTRAINT ALKIS_BZI PRIMARY KEY (ogr_fid)
10);
11
12-- BeziehungssÀtze aufrÀumen
13CREATE OR REPLACE TRIGGER alkis_beziehung_ins
14        AFTER INSERT ON "ALKIS_BEZIEHUNGEN"
15        REFERENCING NEW AS NEW
16        FOR EACH ROW
17BEGIN
18        -- avoid table mutation
19        INSERT
20        INTO alkis_beziehungen_insert(ogr_fid,beziehung_von,beziehungsart,beziehung_zu)
21        VALUES (
22                :NEW.ogr_fid,
23                :NEW.beziehung_von,
24                :NEW.beziehungsart,
25                :NEW.beziehung_zu
26        );
27END alkis_beziehung_inserted;
28/
29
30-- show errors trigger alkis_beziehung_ins;
31
32CREATE OR REPLACE TRIGGER alkis_beziehungen_a_ins
33        AFTER INSERT ON alkis_beziehungen
34BEGIN
35        FOR a IN (SELECT * FROM alkis_beziehungen_insert) LOOP
36                DELETE FROM alkis_beziehungen b WHERE a.ogr_fid<b.ogr_fid AND a.beziehung_von=b.beziehung_von AND a.beziehungsart=b.beziehungsart AND a.beziehung_zu=b.beziehung_zu;
37        END LOOP;
38        DELETE FROM alkis_beziehungen_insert;
39END alkis_beziehungen_a_ins;
40/
41
42-- show errors trigger alkis_beziehungen_a_ins
43
44CREATE OR REPLACE TRIGGER delete_feature_trigger
45        BEFORE INSERT ON "DELETE"
46        FOR EACH ROW
47DECLARE
48        s varchar2(2047);
49        gml_id varchar2(13);
50        endete varchar2(20);
51        n INTEGER;
52BEGIN
53        :NEW.typename := upper(substr(:NEW.typename, 1, 30));
54        :NEW.context  := lower(:NEW.context);
55        gml_id        := substr(:NEW.featureid, 1, 16);
56
57        IF :NEW.context IS NULL THEN
58                :NEW.context := 'delete';
59        END IF;
60
61        IF :NEW.context='delete' THEN
62                SELECT to_char(sysdate, 'UTC','YYYY-MM-DD"T"HH24:MI:SS"Z"') INTO endete FROM dual;
63
64        ELSIF :NEW.context='replace' THEN
65                :NEW.safetoignore := lower(:NEW.safetoignore);
66
67                IF :NEW.safetoignore IS NULL THEN
68                        raise_application_error(-20100, :NEW.featureid || ': safeToIgnore nicht gesetzt.');
69                ELSIF :NEW.safetoignore<>'true' AND :NEW.safetoignore<>'false' THEN
70                        raise_application_error(-20100, :NEW.featureid || ': safeToIgnore ''' || :NEW.safetoignore || ''' ungÃŒltig (''true'' oder ''false'' erwartet).');
71                END IF;
72
73                IF :NEW.replacedBy IS NULL OR length(:NEW.replacedBy)<16 THEN
74                        IF :NEW.safetoignore = 'true' THEN
75                                dbms_output.put_line( :NEW.featureid || ': Nachfolger ''' || :NEW.replacedBy || ''' nicht richtig gesetzt - ignoriert' );
76                                :NEW.ignored := 'true';
77                                RETURN;
78                        ELSE
79                                raise_application_error(-20100, :NEW.featureid || ': Nachfolger ''' || :NEW.replacedBy || ''' nicht richtig gesetzt - Abbruch');
80                        END IF;
81                END IF;
82
83                IF length(:NEW.replacedBy)=16 THEN
84                        EXECUTE IMMEDIATE 'SELECT MAX(beginnt) FROM ' || :NEW.typename ||
85                                ' WHERE gml_id=''' || :NEW.replacedBy || ''' AND endet IS NULL'
86                           INTO endete;
87                ELSE
88                        -- replaceBy mit Timestamp
89                        EXECUTE IMMEDIATE 'SELECT beginnt FROM ' || :NEW.typename ||
90                                ' WHERE identifier=''urn:adv:oid:' || :NEW.replacedBy || ''''
91                           INTO endete;
92                        IF endete IS NULL THEN
93                                EXECUTE IMMEDIATE 'SELECT MAX(beginnt) FROM ' || :NEW.typename ||
94                                        ' WHERE gml_id=''' || substr(:NEW.replacedBy,1,16) || ''' AND endet IS NULL'
95                                   INTO endete;
96                       END IF;
97                END IF;
98
99                IF endete IS NULL THEN
100                        IF :NEW.safetoignore = 'true' THEN
101                                dbms_output.put_line(:NEW.featureid || ': Nachfolger ''' || :NEW.replacedBy || ''' nicht gefunden - ignoriert');
102                                :NEW.ignored := 'true';
103                                RETURN;
104                        ELSE
105                                raise_application_error(-20100, :NEW.featureid || ': Nachfolger ''' || :NEW.replacedBy || ''' nicht gefunden - Abbruch');
106                        END IF;
107                END IF;
108        ELSE
109                raise_application_error(-20100, :NEW.featureid || ': UngÃŒltiger Kontext ' || :NEW.context || '''delete'' oder ''replace'' erwartet).');
110        END IF;
111
112        s       := 'UPDATE ' || :NEW.typename
113                || ' SET endet=''' || endete || ''''
114                || ' WHERE gml_id=''' || gml_id || ''''
115                || ' AND endet IS NULL'
116                || ' AND beginnt<''' || endete || '''';
117        EXECUTE IMMEDIATE s;
118        n := SQL%ROWCOUNT;
119        IF n<>1 THEN
120                dbms_output.put_line( 'SQL: ' || s);
121                IF :NEW.context = 'delete' OR :NEW.safetoignore = 'true' THEN
122                        dbms_output.put_line( :NEW.featureid || ': Untergangsdatum von  ' || n || ' Objekten statt nur einem auf ' || endete || ' gesetzt - ignoriert' );
123                        :NEW.ignored := 'true';
124                        RETURN;
125                ELSE
126                        raise_application_error(-20100, :NEW.featureid || ': Untergangsdatum von ' || n || ' Objekten statt nur einem auf ' || endete || ' gesetzt - Abbruch' );
127                END IF;
128        END IF;
129
130        :NEW.ignored := 'false';
131        RETURN;
132END delete_feature_trigger;
133/
134
135-- show errors trigger delete_feature_trigger;
Note: See TracBrowser for help on using the repository browser.