我有一个跟踪整个系统/解决方案的Activity表。 我在Activity表上创建了一个触发器。通过这个触发器,我捕获将被其他系统使用的系统的每个事件。此外,我将更改(I / U / D)插入到Event和EVENTCOLVAL表中。 EVENTCOLVAL表包含Activity表的所有列名和相应的值。
所以我的触发器看起来像这样:
CREATE OR REPLACE TRIGGER TRIG_Actv
AFTER INSERT or UPDATE
ON Activity
FOR EACH ROW
DECLARE
lvEventId number;
BEGIN
lvEventId := EventUniqId.NEXTVAL;
INSERT ALL
INTO Event (EventId,DateLastMaint)
VALUES (lvEventId, SYSTIMESTAMP)
INTO EVENTCOLVAL (EventId, COLNAME, COLVALUE)
VALUES (lvEventId, 'ActivityCol1', :new.ActivityCol1)
INTO EVENTCOLVAL (EventId, COLNAME, COLVALUE)
VALUES (lvEventId, 'ActivityCol2', :new.ActivityCol2)
INTO EVENTCOLVAL (EventId, COLNAME, COLVALUE)
VALUES (lvEventId, 'ActivityCol3', :new.ActivityCol3)
INTO EVENTCOLVAL (EventId, COLNAME, COLVALUE)
VALUES (lvEventId, 'ActivityCol4', :new.ActivityCol4)
INTO EVENTCOLVAL (EventId, COLNAME, COLVALUE)
VALUES (lvEventId, 'ActivityCol5', :new.ActivityCol5)
INTO EVENTCOLVAL (EventId, COLNAME, COLVALUE)
VALUES (lvEventId, 'ActivityCol6', :new.ActivityCol6)
INTO EVENTCOLVAL (EventId, COLNAME, COLVALUE)
VALUES (lvEventId, 'ActivityCol7', :new.ActivityCol7)
INTO EVENTCOLVAL (EventId, COLNAME, COLVALUE)
VALUES (lvEventId, 'ActivityCol8', :new.ActivityCol8)
---
---
---
---
---
INTO EVENTCOLVAL (EventId, COLNAME, COLVALUE)
VALUES (lvEventId, 'ActivityCol30', :new.ActivityCol30)
SELECT * FROM dual;
EXCEPTION
WHEN OTHERS THEN
-------
END TRIG_Actv;
P.S:我不想在触发器中对表EVENTCOLVAL使用多个插入,因为它会受到性能影响,因为我在Activity表中有30列,插入31行将是性能问题。此外,活动表的指标在1秒内至少有100个插入。因此,在一秒钟内插入至少3000行。由于触发器的同步特性,这将使得活动屏幕更慢并且实际上整个系统更慢。有没有其他方法可以
答案 0 :(得分:1)
您可以创建嵌套集合+使用复合触发器(例如http://docs.oracle.com/cd/B28359_01/appdev.111/b28370/triggers.htm#CIHEFGFD)+ forall插入。 的伪代码:强>
CREATE OR REPLACE TRIGGER compound_trigger ...
........
l_nested t_nested := t_nested();
........
BEFORE EACH ROW IS
BEGIN
l_nested.extend();
l_nested(l_nested.count) := ...//populate single row
END BEFORE EACH ROW;
AFTER STATEMENT IS
BEGIN
FORALL i IN 1..l_nested.count
INSERT INTO EVENTCOLVAL(EventId, COLNAME, COLVALUE) VALUES (l_nested(i).eventId, l_nested(i).colName,l_nested(i).value);
END AFTER STATEMENT;