CREATE OR REPLACE TRIGGER delete_feature_trigger
	BEFORE INSERT ON "DELETE"
	FOR EACH ROW
DECLARE
	query varchar2(2047);
	begsql varchar2(2047);
	aktbeg varchar2(2047);
	gml_id varchar2(2047);
BEGIN
	:NEW.typename := lower(:NEW.typename);
	:NEW.context  := lower(:NEW.context);
	gml_id        := substr(:NEW.featureid, 1, 16);

	IF :NEW.context IS NULL THEN
		:NEW.context := 'delete';
	END IF;

	IF :NEW.context='delete' THEN
		-- ersatzloses Loeschen eines Objektes

		query := 'DELETE FROM ' || :NEW.typename
			|| ' WHERE gml_id = ''' || gml_id || '''';
		EXECUTE IMMEDIATE query;

		query := 'DELETE FROM alkis_beziehungen WHERE beziehung_von = ''' || gml_id
			|| ''' OR beziehung_zu = ''' || gml_id || '''';
		EXECUTE IMMEDIATE query;

		dbms_output.put_line( 'Lösche gml_id '|| gml_id || ' in ' || :NEW.typename || ' und Beziehungen');

	ELSE
		-- Ersetzen eines Objektes
		-- In der objekt-Tabelle sind bereits 2 Objekte vorhanden (alt und neu).
		-- Die 2 Datensätze unterscheiden sich nur in ogc_fid und beginnt

		-- beginnt-Wert des aktuellen Objektes ermitteln
		-- RAISE NOTICE 'Suche beginnt von neuem gml_id % ', substr(:NEW.replacedBy, 1, 16);
		begsql := 'SELECT max(beginnt) FROM ' || :NEW.typename || ' WHERE gml_id = ''' || substr(:NEW.replacedBy, 1, 16) || ''' AND endet IS NULL';
		EXECUTE IMMEDIATE begsql INTO aktbeg;

		-- Nur alte Objekte entfernen
		query := 'DELETE FROM ' || :NEW.typename || ' WHERE gml_id = ''' || gml_id || ''' AND beginnt < ''' || aktbeg || '''';
		EXECUTE IMMEDIATE query;

		-- Tabelle alkis_beziehungen
		IF gml_id <> substr(:NEW.replacedBy, 1, 16) THEN -- gml_id gleich
			-- replace mit ungleicher gml_id
			-- Falls dies vorkommt, die Function erweitern
			raise_application_error(-20100, gml_id || ': neue gml_id ' || :NEW.replacedBy || ' bei Replace in ' || :NEW.typename || '. alkis_beziehungen muss aktualisiert werden!');
		-- ELSE
			-- Beziehungen des Objektes wurden redundant noch einmal eingetragen
			-- ToDo:         HIER sofort die Redundanzen zum aktuellen Objekt beseitigen.
			-- Workaround: Nach der Konvertierung werden im Post-Processing
			--             ALLE Redundanzen mit einem SQL-Statemant beseitigt.
		--	RAISE NOTICE 'Ersetze gleiche gml_id % in %', gml_id, :NEW.typename;

		-- ENTWURF ungetestet:
		--query := 'DELETE FROM alkis_beziehungen AS bezalt
		--	WHERE (bezalt.beziehung_von = ' || gml_id || ' OR bezalt.beziehung_zu = ' || gml_id ||')
		--	AND EXISTS (SELECT ogc_fid FROM alkis_beziehungen AS bezneu
		--		WHERE bezalt.beziehung_von = bezneu.beziehung_von
		--		AND bezalt.beziehung_zu = bezneu.beziehung_zu
		--		AND bezalt.beziehungsart = bezneu.beziehungsart
		--		AND bezalt.ogc_fid < bezneu.ogc_fid);'
		--EXECUTE query;

		END IF;
	END IF;

	:NEW.ignored := 'false';
END delete_feature_trigger;
/

show errors trigger delete_feature_trigger;

QUIT;

