Here the DDL-Skript:
CREATE TABLE "APP_ADMIN"."THW_TEST"
( "ID" NUMBER(38,0) NOT NULL ENABLE,
"ORIG_ID" NUMBER(38,0) NOT NULL ENABLE,
"HAPO_ID" NUMBER(38,0) NOT NULL ENABLE,
"BENU_ID" NUMBER(38,0) NOT NULL ENABLE,
"ZULETZT_MUTIERT" DATE DEFAULT systimestamp NOT NULL ENABLE,
"DATA" VARCHAR2(100 BYTE),
"GUELTIG_BIS" TIMESTAMP (9) DEFAULT TO_TIMESTAMP('31.12.9999 23:59:59.999999999', 'DD.MM.YYYY HH24:MI:SS.FF') NOT NULL ENABLE,
"GUELTIG_VON" TIMESTAMP (9) DEFAULT systimestamp NOT NULL ENABLE,
CONSTRAINT "THW_TEST_PK" PRIMARY KEY ("ID")
USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
TABLESPACE "USERS" ENABLE
) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
TABLESPACE "USERS" ;
CREATE INDEX "APP_ADMIN"."THW_TEST_IDX_BENU_ID" ON "APP_ADMIN"."THW_TEST" ("BENU_ID")
PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
TABLESPACE "USERS" ;
CREATE INDEX "APP_ADMIN"."THW_TEST_IDX_GUELTIG_BIS" ON "APP_ADMIN"."THW_TEST" ("GUELTIG_BIS")
PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
TABLESPACE "USERS" ;
CREATE INDEX "APP_ADMIN"."THW_TEST_IDX_GUELTIG_VON" ON "APP_ADMIN"."THW_TEST" ("GUELTIG_VON")
PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
TABLESPACE "USERS" ;
CREATE INDEX "APP_ADMIN"."THW_TEST_IDX_HAPO_ID" ON "APP_ADMIN"."THW_TEST" ("HAPO_ID")
PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
TABLESPACE "USERS" ;
CREATE INDEX "APP_ADMIN"."THW_TEST_IDX_ORIG_ID" ON "APP_ADMIN"."THW_TEST" ("ORIG_ID")
PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
TABLESPACE "USERS" ;
CREATE INDEX "APP_ADMIN"."THW_TEST_IDX_ZULETZT_MUTIERT" ON "APP_ADMIN"."THW_TEST" ("ZULETZT_MUTIERT")
PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
TABLESPACE "USERS" ;
CREATE UNIQUE INDEX "APP_ADMIN"."THW_TEST_PK" ON "APP_ADMIN"."THW_TEST" ("ID")
PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
TABLESPACE "USERS" ;
CREATE OR REPLACE TRIGGER "APP_ADMIN"."THW_TEST_TRG_INS"
BEFORE INSERT ON "THW_TEST"
FOR EACH ROW
BEGIN
-- Neuer Hauptdatensatz
IF (:NEW.ORIG_ID IS NULL) THEN
-- Wenn ID noch leer ist, dann automatisch eine neue Sequenz vergeben
IF (:NEW.ID IS NULL) THEN
:NEW.ID := THW_TEST_SEQ_ID.nextval;
END IF;
-- und die Original-ID auf die ID (primary key) setzen
:NEW.ORIG_ID := :NEW.ID;
-- Wenn die Hapo_ID nicht angegeben wurde, dann diese auf 0 setzen (Dummy Hauptposition)
IF (:NEW.HAPO_ID IS NULL) THEN
:NEW.HAPO_ID := 0;
END IF;
-- Wenn Die Benu_ID nciht angegeben wurde, dann die Benutzer-ID anhand der Session-Infos bestimmen
IF (:NEW.BENU_ID IS NULL) THEN
:NEW.BENU_ID := APP_BENUTZER.getBenutzerKSW_M(SYS_CONTEXT('USERENV','OS_USER'));
END IF;
END IF;
END;
/
ALTER TRIGGER "APP_ADMIN"."THW_TEST_TRG_INS" ENABLE;
CREATE OR REPLACE TRIGGER "APP_ADMIN"."THW_TEST_TRG_DEL"
FOR DELETE ON APP_ADMIN.THW_TEST
COMPOUND TRIGGER
-- Datentyp für einen Datensatz der Tabelle
TYPE t_history_tab IS TABLE OF THW_TEST%ROWTYPE;
-- Deklaration der Variablen
l_history_tab t_history_tab := t_history_tab();
l_index SIMPLE_INTEGER := 0;
-- ===============================================================
-- BEFORE EACH ROW
-- ===============================================================
BEFORE EACH ROW IS
BEGIN
-- Wenn es sich um den Hauptdatensatz handelt, dann auch noch alle historisierten Datensätze löschen
IF (:OLD.ID=:OLD.ORIG_ID) THEN
-- Zähler inkrementieren und Collection erweitern
l_history_tab.extend();
l_index := l_history_tab.COUNT();
-- Die ID des Hauptdatensatzes zwischenspeichern
l_history_tab(l_index).id := :old.id;
END IF;
END BEFORE EACH ROW;
-- ===============================================================
-- AFTER STATEMENT
-- ===============================================================
AFTER STATEMENT IS
-- DECLARE
-- PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
-- Wenn es was zu löschen gibt, dann hier erledigen
IF (l_history_tab.COUNT() > 0) THEN
-- Alle gespeicherten Records verarbeiten
FOR i IN l_index..l_history_tab.COUNT()
LOOP
-- Wurde der Hauptdatensatz gelöscht, dann alle dazugehörenden History-Datensätze auch noch löschen
DELETE THW_TEST WHERE (THW_TEST.ORIG_ID=l_history_tab(l_index).ID);
END LOOP;
END IF;
l_history_tab.delete();
END AFTER STATEMENT;
END THW_TEST_TRG_DEL;
/
ALTER TRIGGER "APP_ADMIN"."THW_TEST_TRG_DEL" ENABLE;
CREATE OR REPLACE TRIGGER "APP_ADMIN"."THW_TEST_TRG_UPD" FOR UPDATE ON APP_ADMIN.THW_TEST
COMPOUND TRIGGER
-- Datentyp für einen Datensatz der Tabelle
TYPE t_history_tab IS TABLE OF THW_TEST%ROWTYPE;
-- Deklaration der Variablen
l_history_tab t_history_tab := t_history_tab();
l_timestamp_von timestamp(9);
l_timestamp_bis timestamp(9);
l_index SIMPLE_INTEGER := 0;
-- ===============================================================
-- BEFORE EACH ROW
-- ===============================================================
BEFORE EACH ROW IS
BEGIN
-- Aktuelle Zeitstempel bestimmen
l_timestamp_von := systimestamp;
l_timestamp_bis := l_timestamp_von - numtodsinterval(0.000001,'SECOND');
-- Wird der Hauptdatensatz verändert, dann Daten historisieren
IF (:OLD.ORIG_ID IS NOT NULL) AND (:OLD.ID IS NOT NULL) AND (:OLD.ORIG_ID = :OLD.ID) THEN
-- Zähler inkrementieren und Collection erweitern
l_history_tab.extend();
l_index := l_history_tab.COUNT;
-- Den alten Daten-Zustand mit neuer Sequenz zwischenspeichern
l_history_tab(l_index).ID := THW_TEST_SEQ_ID.nextval;
l_history_tab(l_index).orig_id := :OLD.orig_id;
l_history_tab(l_index).hapo_id := :OLD.hapo_id;
l_history_tab(l_index).benu_id := :OLD.benu_id;
l_history_tab(l_index).gueltig_von := :OLD.gueltig_von;
l_history_tab(l_index).gueltig_bis := l_timestamp_bis;
l_history_tab(l_index).zuletzt_mutiert := :OLD.zuletzt_mutiert;
l_history_tab(l_index).data := :OLD.data;
END IF;
-- Zuletzt mutiert aktualisieren
:NEW.gueltig_von := l_timestamp_von;
:NEW.zuletzt_mutiert := l_timestamp_von;
END BEFORE EACH ROW;
-- ===============================================================
-- AFTER STATEMENT
-- ===============================================================
AFTER STATEMENT IS
BEGIN
-- Wenn es was zu historisieren gibt, dann hier erledigen
IF (l_history_tab.COUNT() > 0) THEN
-- Alle gespeicherten Records verarbeiten
FOR i IN l_index..l_history_tab.COUNT()
LOOP
-- Alten Datensatz einschieben
INSERT INTO THW_TEST VALUES l_history_tab(l_index);
END LOOP;
l_history_tab.delete();
END IF;
END AFTER STATEMENT;
END THW_TEST_TRG_UPD;
/
ALTER TRIGGER "APP_ADMIN"."THW_TEST_TRG_UPD" ENABLE;
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 120: 121: 122: 123: 124: 125: 126: 127: 128: 129: 130: 131: 132: 133: 134: 135: 136: 137: 138: 139: 140: 141: 142: 143: 144: 145: 146: 147: 148: 149: 150: 151: 152: 153: 154: 155: 156: 157: 158: 159: 160: 161: 162: 163: 164: 165: 166: 167: 168: 169: 170: 171: 172: 173: 174: 175: 176: 177: 178: 179: 180: 181: 182: 183: 184: 185: 186: 187: 188: 189: 190: 191: 192: 193: 194: 195: 196: 197: 198: 199: 200: 201: 202: 203: 204: 205: 206: 207: 208: 209: 210: 211: 212: 213: 214: 215: 216: 217: 218: 219: 220: 221: 222: 223: 224: 225: 226: 227: 228: 229: 230: 231: 232: 233: 234: 235: 236: 237: 238: 239: 240: 241: 242: 243: 244: 245: 246: 247: 248:





by: angelIIIPosted on 2008-12-15 at 22:44:47ID: 23181418
as you found, this is indeed not possible (yet)