Changeset 210 for trunk/data/konvert/postnas_0.7/alkis-functions.sql
- Timestamp:
- 01/25/13 16:01:22 (11 years ago)
- File:
-
- 1 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;
Note: See TracChangeset
for help on using the changeset viewer.