Changeset 210
- Timestamp:
- 01/25/13 16:01:22 (11 years ago)
- Location:
- trunk/data/konvert/postnas_0.7
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/data/konvert/postnas_0.7/alkis-functions.sql
r192 r210 273 273 CREATE OR REPLACE FUNCTION delete_feature_hist() RETURNS TRIGGER AS $$ 274 274 DECLARE 275 sql TEXT; 276 gml_id TEXT; 275 s TEXT; 276 alt_id TEXT; 277 neu_id TEXT; 278 beginnt TEXT; 277 279 endete TEXT; 278 280 n INTEGER; 279 281 BEGIN 280 282 NEW.context := lower(NEW.context); 281 gml_id := substr(NEW.featureid, 1, 16);282 283 283 IF NEW.context IS NULL THEN 284 284 NEW.context := 'delete'; 285 END IF; 286 287 -- TIMESTAMP weder in gml_id noch identifier verlÀÃlich. 288 -- also ggf. aus Datenbank holen 289 290 IF length(NEW.featureid)=32 THEN 291 alt_id := substr(NEW.featureid, 1, 16); 292 293 IF NEW.featureid<>NEW.replacedBy THEN 294 -- Beginnt-Datum aus Timestamp 295 beginnt := substr(NEW.featureid, 17, 4) || '-' 296 || substr(NEW.featureid, 21, 2) || '-' 297 || substr(NEW.featureid, 23, 2) || 'T' 298 || substr(NEW.featureid, 26, 2) || ':' 299 || substr(NEW.featureid, 28, 2) || ':' 300 || substr(NEW.featureid, 30, 2) || 'Z' 301 ; 302 END IF; 303 ELSIF length(NEW.featureid)=16 THEN 304 alt_id := NEW.featureid; 305 ELSE 306 RAISE EXCEPTION '%: LÀnge 16 oder 32 statt % erwartet.', NEW.featureid, length(NEW.featureid); 307 END IF; 308 309 IF beginnt IS NULL THEN 310 -- Beginnt-Datum des Àltesten Eintrag, der nicht untergegangen ist 311 -- => der Satz dessen 'endet' gesetzt werden muà 312 EXECUTE 'SELECT min(beginnt) FROM ' || NEW.typename 313 || ' WHERE gml_id=''' || alt_id || '''' 314 || ' AND endet IS NULL' 315 INTO beginnt; 285 316 END IF; 286 317 … … 297 328 END IF; 298 329 299 IF NEW.replacedBy IS NULL OR length(NEW.replacedBy)<16 THEN 300 IF NEW.safetoignore = 'true' THEN 301 RAISE NOTICE '%: Nachfolger ''%'' nicht richtig gesetzt - ignoriert', NEW.featureid, NEW.replacedBy; 302 NEW.ignored := true; 303 RETURN NEW; 304 ELSE 305 RAISE EXCEPTION '%: Nachfolger ''%'' nicht richtig gesetzt - Abbruch', NEW.featureid, NEW.replacedBy; 330 IF length(NEW.replacedBy)=32 THEN 331 -- Beginnt-Datum aus Timestamp 332 neu_id := substr(NEW.replacedBy, 1, 16); 333 334 IF NEW.featureid<>NEW.replacedBy THEN 335 endete := substr(NEW.replacedBy, 17, 4) || '-' 336 || substr(NEW.replacedBy, 21, 2) || '-' 337 || substr(NEW.replacedBy, 23, 2) || 'T' 338 || substr(NEW.replacedBy, 26, 2) || ':' 339 || substr(NEW.replacedBy, 28, 2) || ':' 340 || substr(NEW.replacedBy, 30, 2) || 'Z' 341 ; 306 342 END IF; 307 END IF; 308 309 IF length(NEW.replacedBy)=16 THEN 310 EXECUTE 'SELECT beginnt FROM ' || NEW.typename || 311 ' WHERE gml_id=''' || NEW.replacedBy || ''' AND endet IS NULL' || 312 ' ORDER BY beginnt DESC LIMIT 1' 313 INTO endete; 314 ELSE 315 -- replaceBy mit Timestamp 316 EXECUTE 'SELECT beginnt FROM ' || NEW.typename || 317 ' WHERE identifier=''urn:adv:oid:' || NEW.replacedBy || '''' 318 INTO endete; 319 IF endete IS NULL THEN 320 EXECUTE 'SELECT beginnt FROM ' || NEW.typename || 321 ' WHERE gml_id=''' || substr(NEW.replacedBy,1,16) || ''' AND endet IS NULL' || 322 ' ORDER BY beginnt DESC LIMIT 1' 323 INTO endete; 324 END IF; 343 ELSIF length(NEW.replacedBy)=16 THEN 344 neu_id := NEW.replacedBy; 345 ELSIF length(NEW.replacedBy)<>16 THEN 346 RAISE EXCEPTION '%: LÀnge 16 oder 32 statt % erwartet.', NEW.replacedBy, length(NEW.replacedBy); 325 347 END IF; 326 348 327 349 IF endete IS NULL THEN 328 IF NEW.safetoignore = 'true' THEN329 RAISE NOTICE '%: Nachfolger % nicht gefunden - ignoriert', NEW.featureid, NEW.replacedBy;330 NEW.ignored := true;331 RETURN NEW;332 ELSE333 RAISE EXCEPTION '%: Nachfolger % nicht gefunden', NEW.featureid, NEW.replacedBy;334 END IF;350 -- Beginnt-Datum des neuesten Eintrag, der nicht untergegangen ist 351 -- => Enddatum fÃŒr vorherigen Satz 352 EXECUTE 'SELECT max(beginnt) FROM ' || NEW.typename 353 || ' WHERE gml_id=''' || neu_id || '''' 354 || ' AND beginnt>''' || beginnt || '''' 355 || ' AND endet IS NULL' 356 INTO endete; 335 357 END IF; 336 358 ELSE … … 338 360 END IF; 339 361 340 sql := 'UPDATE ' || NEW.typename 341 || ' SET endet=''' || endete || '''' 342 || ' WHERE gml_id=''' || gml_id || '''' 343 || ' AND endet IS NULL' 344 || ' AND beginnt<''' || endete || ''''; 345 -- RAISE NOTICE 'SQL: %', sql; 346 EXECUTE sql; 362 IF alt_id<>neu_id THEN 363 RAISE NOTICE 'Objekt % wird durch Objekt % ersetzt.', alt_id, neu_id; 364 END IF; 365 366 IF beginnt IS NULL THEN 367 RAISE NOTICE 'Kein Beginndatum fuer Objekt % gefunden.', alt_id; 368 END IF; 369 370 IF endete IS NULL THEN 371 RAISE NOTICE 'Kein Beginndatum fuer Objekt % gefunden.', neu_id; 372 END IF; 373 374 IF beginnt IS NULL OR endete IS NULL OR beginnt=endete THEN 375 RAISE EXCEPTION 'Objekt % wird durch Objekt % ersetzt (leere Lebensdauer?).', alt_id, neu_id; 376 END IF; 377 378 s := 'UPDATE ' || NEW.typename 379 || ' SET endet=''' || endete || '''' 380 || ' WHERE gml_id=''' || alt_id || '''' 381 || ' AND beginnt=''' || beginnt || '''' 382 || ' AND endet IS NULL'; 383 EXECUTE s; 347 384 GET DIAGNOSTICS n = ROW_COUNT; 348 385 IF n<>1 THEN 349 RAISE NOTICE 'SQL: %', s ql;386 RAISE NOTICE 'SQL: %', s; 350 387 IF NEW.context = 'delete' OR NEW.safetoignore = 'true' THEN 351 RAISE NOTICE '%: Untergangsdatum von % Objekten statt nur einem auf % gesetzt - ignoriert', NEW.featureid, n, endete; 388 RAISE NOTICE '%: Untergangsdatum von % Objekten statt einem auf % gesetzt - ignoriert', NEW.featureid, n, endete; 389 NEW.ignored := true; 390 RETURN NEW; 391 ELSIF n=0 THEN 392 EXECUTE 'SELECT endet FROM ' || NEW.typename || 393 ' WHERE gml_id=''' || alt_id || '''' || 394 ' AND beginnt=''' || beginnt || '''' 395 INTO endete; 396 397 IF NOT endete IS NULL THEN 398 RAISE NOTICE '%: Objekte bereits % ungegegangen - ignoriert', NEW.featureid, endete; 399 ELSE 400 RAISE NOTICE '%: Objekt nicht gefunden - ignoriert', NEW.featureid; 401 END IF; 402 352 403 NEW.ignored := true; 353 404 RETURN NEW; 354 405 ELSE 355 RAISE EXCEPTION '%: Untergangsdatum von % Objekten statt nureinem auf % gesetzt - Abbruch', NEW.featureid, n, endete;406 RAISE EXCEPTION '%: Untergangsdatum von % Objekten statt einem auf % gesetzt - Abbruch', NEW.featureid, n, endete; 356 407 END IF; 357 408 END IF; -
trunk/data/konvert/postnas_0.7/alkis-trigger-hist-oracle.sql
r209 r210 47 47 DECLARE 48 48 s varchar2(2047); 49 gml_id varchar2(13); 49 alt_id varchar2(16); 50 neu_id varchar2(16); 51 beginnt varchar2(20); 50 52 endete varchar2(20); 51 53 n INTEGER; … … 53 55 :NEW.typename := upper(substr(:NEW.typename, 1, 30)); 54 56 :NEW.context := lower(:NEW.context); 55 gml_id := substr(:NEW.featureid, 1, 16);56 57 57 IF :NEW.context IS NULL THEN 58 58 :NEW.context := 'delete'; 59 59 END IF; 60 60 61 -- TIMESTAMP weder in gml_id noch identifier verlÀÃlich. 62 -- also ggf. aus Datenbank holen 63 64 IF length(:NEW.featureid)=32 THEN 65 alt_id := substr(:NEW.featureid, 1, 16); 66 67 IF :NEW.featureid<>:NEW.replacedBy THEN 68 -- Beginnt-Datum aus Timestamp 69 beginnt := substr(:NEW.featureid, 17, 4) || '-' 70 || substr(:NEW.featureid, 21, 2) || '-' 71 || substr(:NEW.featureid, 23, 2) || 'T' 72 || substr(:NEW.featureid, 26, 2) || ':' 73 || substr(:NEW.featureid, 28, 2) || ':' 74 || substr(:NEW.featureid, 30, 2) || 'Z' 75 ; 76 END IF; 77 ELSIF length(:NEW.featureid)=16 THEN 78 alt_id := :NEW.featureid; 79 ELSE 80 raise_application_error(-20100, :NEW.featureid || ': LÀnge 16 oder 32 statt ' || length(:NEW.featureid) || ' erwartet.'); 81 END IF; 82 83 IF beginnt IS NULL THEN 84 -- Beginnt-Datum des Àltesten Eintrag, der nicht untergegangen ist 85 -- => der Satz dessen 'endet' gesetzt werden muà 86 EXECUTE IMMEDIATE 'SELECT min(beginnt) FROM ' || :NEW.typename 87 || ' WHERE gml_id=''' || alt_id || '''' 88 || ' AND endet IS NULL' 89 INTO beginnt; 90 END IF; 91 61 92 IF :NEW.context='delete' THEN 62 SELECT to_char(sysdate, ' UTC','YYYY-MM-DD"T"HH24:MI:SS"Z"') INTO endete FROM dual;93 SELECT to_char(sysdate, 'YYYY-MM-DD"T"HH24:MI:SS"Z"') INTO endete FROM dual; 63 94 64 95 ELSIF :NEW.context='replace' THEN … … 71 102 END IF; 72 103 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'); 104 IF length(:NEW.replacedBy)=32 THEN 105 -- Beginnt-Datum aus Timestamp 106 neu_id := substr(:NEW.replacedBy, 1, 16); 107 108 IF :NEW.featureid<>:NEW.replacedBy THEN 109 endete := substr(:NEW.replacedBy, 17, 4) || '-' 110 || substr(:NEW.replacedBy, 21, 2) || '-' 111 || substr(:NEW.replacedBy, 23, 2) || 'T' 112 || substr(:NEW.replacedBy, 26, 2) || ':' 113 || substr(:NEW.replacedBy, 28, 2) || ':' 114 || substr(:NEW.replacedBy, 30, 2) || 'Z' 115 ; 80 116 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; 117 ELSIF length(:NEW.replacedBy)=16 THEN 118 neu_id := :NEW.replacedBy; 119 ELSIF length(:NEW.replacedBy)<>16 THEN 120 raise_application_error(-20100, :NEW.replacedBy || ': LÀnge 16 oder 32 statt ' || length(:NEW.replacedBy) || ' erwartet.'); 97 121 END IF; 98 122 99 123 IF endete IS NULL THEN 100 IF :NEW.safetoignore = 'true' THEN101 dbms_output.put_line(:NEW.featureid || ': Nachfolger ''' || :NEW.replacedBy || ''' nicht gefunden - ignoriert');102 :NEW.ignored := 'true';103 RETURN;104 ELSE105 raise_application_error(-20100, :NEW.featureid || ': Nachfolger ''' || :NEW.replacedBy || ''' nicht gefunden - Abbruch');106 END IF;124 -- Beginnt-Datum des neuesten Eintrag, der nicht untergegangen ist 125 -- => Enddatum fÃŒr vorherigen Satz 126 EXECUTE IMMEDIATE 'SELECT max(beginnt) FROM ' || :NEW.typename 127 || ' WHERE gml_id=''' || neu_id || '''' 128 || ' AND beginnt>''' || beginnt || '''' 129 || ' AND endet IS NULL' 130 INTO endete; 107 131 END IF; 108 132 ELSE … … 110 134 END IF; 111 135 112 s := 'UPDATE ' || :NEW.typename 113 || ' SET endet=''' || endete || '''' 114 || ' WHERE gml_id=''' || gml_id || '''' 115 || ' AND endet IS NULL' 116 || ' AND beginnt<''' || endete || ''''; 136 IF alt_id<>neu_id THEN 137 dbms_output.put_line('Objekt ' || alt_id || ' wird durch Objekt ' || neu_id || ' ersetzt.'); 138 END IF; 139 140 IF beginnt IS NULL THEN 141 dbms_output.put_line('Kein Beginndatum fuer Objekt ' || alt_id || '.'); 142 END IF; 143 144 IF endete IS NULL THEN 145 dbms_output.put_line('Kein Beginndatum fuer Objekt ' || neu_id || '.'); 146 END IF; 147 148 IF beginnt IS NULL OR endete IS NULL OR beginnt=endete THEN 149 raise_application_error(-20100, 'Objekt ' || alt_id || ' wird durch Objekt ' || neu_id || ' ersetzt (leere Lebensdauer?).'); 150 END IF; 151 152 s := 'UPDATE ' || :NEW.typename 153 || ' SET endet=''' || endete || '''' 154 || ' WHERE gml_id=''' || alt_id || '''' 155 || ' AND beginnt=''' || beginnt || '''' 156 || ' AND endet IS NULL'; 117 157 EXECUTE IMMEDIATE s; 118 158 n := SQL%ROWCOUNT; -
trunk/data/konvert/postnas_0.7/alkis-trigger-hist.sql
r192 r210 5 5 6 6 CREATE TRIGGER insert_beziehung_trigger 7 8 9 7 AFTER INSERT ON alkis_beziehungen 8 FOR EACH ROW 9 EXECUTE PROCEDURE alkis_beziehung_inserted(); -
trunk/data/konvert/postnas_0.7/alkis_PostNAS_0.7_schema.sql
r209 r210 4418 4418 -- Digitales Gelaendemodell50 = DGM50 4419 4419 4420 4421 -- wenn schon, dann auch alle Tabellen mit Kommentaren versehen:4422 COMMENT ON TABLE geometry_columns IS 'Metatabelle der Geometrie-Tabellen, Tabellen ohne Geometrie bekommen Dummy-Eintrag fÃŒr PostNAS-Konverter (GDAL/OGR)';4423 COMMENT ON TABLE spatial_ref_sys IS 'Koordinatensysteme und ihre Projektionssparameter';4424 4425 4420 -- Schema aktualisieren (setzt auch die Indizes neu) 4426 4421 -- SELECT alkis_update_schema();
Note: See TracChangeset
for help on using the changeset viewer.