首先需要创建一张存放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)上面的过程可以记录具体的forms/block/item以及哪个level上执行了trigger, 这对于诊断trigger的调用比较有帮助. 通常还有一些另外的情况, 我们需要知道哪段代码被执行了, 以及相关的输出, 但是不需要记录forms/block/item等相关信息, 可以使用下面的存储过程:
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;
/
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--
没有评论:
发表评论