- 创建包
- 内部包创建2个过程和2个函数
- 现在添加audit以捕获中每个过程和函数的开始时间和结束时间审计表
- TBL_AUDIT_LOG(进程名称、开始时间、结束时间、创建者、创建者dttm(
尽管可以使用动态SQL(请参阅execute immediate
(在包(实际上是其过程(中创建表,但不应该这样做。这是一种糟糕的做法。只需将SQL级别的表创建为
create table TBL_AUDIT_LOG
(process_name varchar2(60),
start_time date,
end_time date,
created_by varchar2(30),
created_dttm date);
并在包装内使用。我建议您不要直接从包中的每个程序单元插入到表中——创建另一个日志记录过程,它将接受某些参数并执行日志记录本身,可能是作为一个自主事务。类似这样的东西:
procedure p_log (par_proc_name in varchar2, par_start in date, par_end in date) as
begin
insert into tbl_audit_log (process_name, start_time, end_time, created_by, created_dttm)
values (par_proc_name, par_start, par_end, user, sysdate);
commit;
end;
我会创建一个日志记录过程:
PROCEDURE INSERT_LOG(P_FROM IN VARCHAR2,
P_START_DATE IN DATE,
P_END_DATE IN DATE) IS
BEGIN
INSERT INTO TBL_AUDIT_LOG VALUES (P_FROM , P_START_DATE, P_START_DATE,USER, NULL);
COMMIT;
END;
不是:我不确定created_dttm是什么,所以我传递了null。
在你的程序中,你可以这样使用它:
PROCEDURE TEST_P(P_VAR IN NUMBER) IS
C_LOG_START DATE;
C_LOG_END DATE;
BEGIN
C_LOG_START := SYSDATE ;
/*
YOUR PROC LOGİC
*/
C_LOG_END := SYSDATE ;
-- CALL LOG ROC HERE
INSERT_LOG('TEST_P',C_LOG_START,C_LOG_END,NULL);
END;
它的smiliar有函数,但你必须这样声明你的函数:
FUNCTION GET_CUSTOMER(REFNO VARCHAR2) RETURN TBL_CUSTOMER_PROFILE IS
PRAGMA AUTONOMOUS_TRANSACTION;
IS_NODATA BOOLEAN;
LORESULT TBL_CUSTOMER_PROFILE;
BEGIN
/*function logic*/
END;
检查这里,这是非常重要的: