Changeset 192 for trunk/data/konvert/postnas_0.7/alkis-functions.sql
- Timestamp:
- 01/14/13 15:07:54 (11 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/data/konvert/postnas_0.7/alkis-functions.sql
r190 r192 108 108 AND ( substr(f_table_name,1,2) IN ('ax_','ap_','ks_') 109 109 OR f_table_name IN ('alkis_beziehungen','delete') ); 110 END; 111 $$ LANGUAGE plpgsql; 112 113 -- Table/View/Sequence löschen, wenn vorhanden 114 CREATE OR REPLACE FUNCTION alkis_dropobject(t TEXT) RETURNS void AS $$ 115 DECLARE 116 c RECORD; 117 BEGIN 118 -- drop objects 119 FOR c IN SELECT relkind,relname 120 FROM pg_class 121 JOIN pg_namespace ON pg_class.relnamespace=pg_namespace.oid 122 WHERE pg_namespace.nspname='public' AND pg_class.relname=t 123 ORDER BY relkind 124 LOOP 125 IF c.relkind = 'v' THEN 126 RAISE NOTICE 'Dropping view %', c.relname; 127 EXECUTE 'DROP VIEW ' || c.relname || ' CASCADE'; 128 ELSIF c.relkind = 'r' THEN 129 RAISE NOTICE 'Dropping table %', c.relname; 130 EXECUTE 'DROP TABLE ' || c.relname || ' CASCADE'; 131 ELSIF c.relkind = 'S' THEN 132 RAISE NOTICE 'Dropping sequence %', c.relname; 133 EXECUTE 'DROP SEQUENCE ' || c.relname; 134 ELSIF c.relkind <> 'i' THEN 135 RAISE NOTICE 'Unexpected type %,%', c.relkind, c.relname; 136 END IF; 137 END LOOP; 110 111 RETURN r; 138 112 END; 139 113 $$ LANGUAGE plpgsql; … … 290 264 $$ LANGUAGE plpgsql; 291 265 266 -- Im Trigger 'delete_feature_trigger' muss eine dieser beiden Funktionen 267 -- (delete_feature_hist oder delete_feature_kill) verlinkt werden, je nachdem ob nur 268 -- aktuelle oder auch historische Objekte in der Datenbank gefÃŒhrt werden sollen. 292 269 293 270 -- Löschsatz verarbeiten (MIT Historie) … … 320 297 END IF; 321 298 322 IF NEW.replacedBy IS NULL OR NEW.replacedBy = ''THEN299 IF NEW.replacedBy IS NULL OR length(NEW.replacedBy)<16 THEN 323 300 IF NEW.safetoignore = 'true' THEN 324 RAISE NOTICE '%: Nachfolger nicht gesetzt - ignoriert', NEW.featureid;301 RAISE NOTICE '%: Nachfolger ''%'' nicht richtig gesetzt - ignoriert', NEW.featureid, NEW.replacedBy; 325 302 NEW.ignored := true; 326 303 RETURN NEW; 327 304 ELSE 328 RAISE EXCEPTION '%: Nachfolger nicht gesetzt', NEW.featureid;305 RAISE EXCEPTION '%: Nachfolger ''%'' nicht richtig gesetzt - Abbruch', NEW.featureid, NEW.replacedBy; 329 306 END IF; 330 307 END IF; 331 308 332 sql := 'SELECT beginnt FROM ' || NEW.typename || ' WHERE identifier=''urn:adv:oid:' || NEW.replacedBy || ''''; 333 -- RAISE NOTICE 'SQL: %', sql; 334 335 -- FEHLER: identifier enthÀlt nur gml_id, aber nicht den Timestamp dahinter 336 -- Daher wird das zu ersetzende Objekt nicht gefunden 337 338 EXECUTE sql INTO endete; 339 340 IF endete IS NULL AND length(NEW.replacedBy)>16 THEN 341 RAISE NOTICE '%: Nachfolger % nicht gefunden - versuche ''%''', NEW.featureid, NEW.replacedBy, substr(NEW.replacedBy, 1, 16); 342 sql := 'SELECT beginnt FROM ' || NEW.typename 343 || ' WHERE gml_id=''' || substr(NEW.replacedBy, 1, 16) || '''' 344 || ' AND endet IS NULL' 345 || ' AND identifier<>''urn:adv:oid:'|| NEW.featureid || '''' 346 || ' ORDER BY beginnt DESC' 347 || ' LIMIT 1'; 348 EXECUTE sql INTO endete; 349 gml_id := gml_id || ''' AND beginnt<>''' || endete; 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; 350 325 END IF; 351 326 … … 359 334 END IF; 360 335 END IF; 361 362 -- RAISE NOTICE '%: Nachfolgeobjekt beginnt um %.', NEW.featureid, endete;363 336 ELSE 364 337 RAISE EXCEPTION '%: UngÃŒltiger Kontext % (''delete'' oder ''replace'' erwartet).', NEW.featureid, NEW.context; … … 367 340 sql := 'UPDATE ' || NEW.typename 368 341 || ' SET endet=''' || endete || '''' 369 || ' WHERE (identifier=''urn:adv:oid:' || NEW.featureid || ''' OR identifier=''urn:adv:oid:' || gml_id || ''')' 370 || ' AND endet IS NULL'; 342 || ' WHERE gml_id=''' || gml_id || '''' 343 || ' AND endet IS NULL' 344 || ' AND beginnt<''' || endete || ''''; 371 345 -- RAISE NOTICE 'SQL: %', sql; 372 346 EXECUTE sql; … … 379 353 RETURN NEW; 380 354 ELSE 381 RAISE EXCEPTION '%: Untergangsdatum von % Objekten statt nur einem auf % gesetzt - ignoriert', NEW.featureid, n, endete;355 RAISE EXCEPTION '%: Untergangsdatum von % Objekten statt nur einem auf % gesetzt - Abbruch', NEW.featureid, n, endete; 382 356 END IF; 383 357 END IF; … … 425 399 -- Die 2 DatensÀtze unterscheiden sich nur in ogc_fid und beginnt 426 400 427 -- beginnt-Wert des aktuellen Objektes ermitteln 401 -- beginnt-Wert des aktuellen Objektes ermitteln 428 402 -- RAISE NOTICE 'Suche beginnt von neuem gml_id % ', substr(NEW.replacedBy, 1, 16); 429 403 begsql := 'SELECT max(beginnt) FROM ' || NEW.typename || ' WHERE gml_id = ''' || substr(NEW.replacedBy, 1, 16) || ''' AND endet IS NULL'; … … 431 405 432 406 -- Nur alte Objekte entfernen 433 query := 'DELETE FROM ' || NEW.typename 407 query := 'DELETE FROM ' || NEW.typename 434 408 || ' WHERE gml_id = ''' || gml_id || ''' AND beginnt < ''' || aktbeg || ''''; 435 409 EXECUTE query; … … 439 413 -- Beziehungen des Objektes wurden redundant noch einmal eingetragen 440 414 -- ToDo: HIER sofort die Redundanzen zum aktuellen Objekt beseitigen. 441 -- Workaround: Nach der Konvertierung werden im Post-Processing 415 -- Workaround: Nach der Konvertierung werden im Post-Processing 442 416 -- ALLE Redundanzen mit einem SQL-Statemant beseitigt. 443 417 -- RAISE NOTICE 'Ersetze gleiche gml_id % in %', gml_id, NEW.typename; 444 418 445 419 -- ENTWURF ungetestet: 446 --query := 'DELETE FROM alkis_beziehungen AS bezalt 420 --query := 'DELETE FROM alkis_beziehungen AS bezalt 447 421 -- WHERE (bezalt.beziehung_von = ' || gml_id || ' OR bezalt.beziehung_zu = ' || gml_id ||') 448 -- AND EXISTS (SELECT ogc_fid FROM alkis_beziehungen AS bezneu 449 -- WHERE bezalt.beziehung_von = bezneu.beziehung_von 422 -- AND EXISTS (SELECT ogc_fid FROM alkis_beziehungen AS bezneu 423 -- WHERE bezalt.beziehung_von = bezneu.beziehung_von 450 424 -- AND bezalt.beziehung_zu = bezneu.beziehung_zu 451 425 -- AND bezalt.beziehungsart = bezneu.beziehungsart … … 465 439 $$ LANGUAGE plpgsql; 466 440 467 -- Im Trigger 'delete_feature_trigger' muss eine dieser beiden Funktionen 468 -- (delete_feature_hist oder delete_feature_kill) verlinkt werden, je nachdem ob nur 469 -- aktuelle oder auch historische Objekte in der Datenbank gefÃŒhrt werden sollen. 441 -- BeziehungssÀtze aufrÀumen 442 CREATE OR REPLACE FUNCTION alkis_beziehung_inserted() RETURNS TRIGGER AS $$ 443 BEGIN 444 DELETE FROM alkis_beziehungen WHERE ogc_fid<NEW.ogc_fid AND beziehung_von=NEW.beziehung_von AND beziehungsart=NEW.beziehungsart AND beziehung_zu=NEW.beziehung_zu; 445 RETURN NEW; 446 END; 447 $$ LANGUAGE plpgsql; 470 448 471 449 -- Wenn die Datenbank MIT Historie angelegt wurde, kann nach dem Laden hiermit aufgerÀumt werden. … … 474 452 c RECORD; 475 453 BEGIN 476 -- In allen Tabellen die Objekte Löschen, die ein Ende-Datum haben454 -- In allen Tabellen die Objekte löschen, die ein Ende-Datum haben 477 455 FOR c IN 478 456 SELECT table_name
Note: See TracChangeset
for help on using the changeset viewer.