2012年11月5日星期一

一个小的Forms Trigger跟踪工具

Oracle forms里面的trigger种类繁多在各个层次都有定义, 并且可以设置trigger的执行方式. 这就导致了很大的灵活性, 以致于有的时候很难去判断某个trigger是否执行.下面是我使用的一个简单工具, 用于记录trigger的相关执行信息.

首先需要创建一张存放trace记录的表及相应的序列:
CREATE TABLE FORMS_TRACE (
    TRACE_ID NUMBER PRIMARY KEY,
    FORMS_NAME VARCHAR2(50),
    BLOCK_NAME VARCHAR2(50),
    ITEM_NAME VARCHAR2(50),
    TRACE_COMMENT VARCHAR2(100),
    TRIGGER_NAME VARCHAR2(50),
    TRIGGER_LEVEL VARCHAR2(1), -- 'B','R', 'F', 'I'/'N'
    TRACE_DATE DATE DEFAULT SYSDATE NOT NULL
);
CREATE SEQUENCE S_FORMS_TRACE MINVALUE 1 MAXVALUE 2147483647 START WITH 1000 INCREMENT BY 1 CACHE 20;
接下来是相应的存储过程, 这里使用了自治性事务(Autonomous Transaction 简称AT), AT经常会使用在日志记录的功能中.
CREATE OR REPLACE PROCEDURE TTRACE(P_FNAME IN VARCHAR2, P_BNAME IN VARCHAR2, P_INAME IN VARCHAR2, P_TNAME IN VARCHAR2, P_LEVEL IN VARCHAR2, P_COMMENT IN VARCHAR2)
IS
    PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
    INSERT INTO FORMS_TRACE(TRACE_ID, FORMS_NAME, BLOCK_NAME, ITEM_NAME, TRIGGER_NAME, TRIGGER_LEVEL, TRACE_COMMENT) VALUES (S_FORMS_TRACE.NEXTVAL, P_FNAME, P_BNAME, P_INAME, P_TNAME, P_LEVEL, P_COMMENT);
    COMMIT;
EXCEPTION WHEN OTHERS THEN
    ROLLBACK;
END;
/
上面的过程可以记录具体的forms/block/item以及哪个level上执行了trigger, 这对于诊断trigger的调用比较有帮助. 通常还有一些另外的情况, 我们需要知道哪段代码被执行了, 以及相关的输出, 但是不需要记录forms/block/item等相关信息, 可以使用下面的存储过程:
CREATE OR REPLACE PROCEDURE CTRACE(P_COMMENT IN VARCHAR2)
IS
    PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
    INSERT INTO FORMS_TRACE(TRACE_ID, TRACE_COMMENT) VALUES (S_FORMS_TRACE.NEXTVAL, P_COMMENT);
    COMMIT;
EXCEPTION WHEN OTHERS THEN
    ROLLBACK;
END;
/
示例:
ttrace('GMDRCPED', 'GMD_RECIPES', null, 'WHEN-NEW-RECORD-INSTANCE', 'B', NULL);
ctrace('some comment');
以上供参考.
--EOF--

没有评论:

发表评论