create or replace package body somePackage as
...
procedure ins_log(
i_msg in varchar2,
i_msg_type in varchar2,
i_msg_code in number default 0,
i_msg_context in varchar2 default null
) IS PRAGMA AUTONOMOUS_TRANSACTION;
begin
insert into myLogTable
(
created_date,
msg,
msg_type,
msg_code,
msg_context
)
values
(
sysdate,
i_msg,
i_msg_type,
i_msg_code,
i_msg_context
);
commit;
end ins_log;
...
end;
create or replace myProcedure as
cursor some_cursor is
select * from someTable;
v_ctr pls_integer := 0;
begin
for rec in some_cursor
loop
v_ctr := v_ctr + 1;
-- do something interesting
if (mod(v_ctr, 1000) = 0) then
somePackage.ins_log('Inserted ' || v_ctr || ' records',
'Log',
i_msg_context=>'myProcedure');
end if;
end loop;
commit;
exception
when others then
somePackage.ins_log(SQLERRM, 'Err', i_msg_context=>'myProcedure');
rollback;
raise;
end;
5 个回复
桔马牛
磐剩
呸溉
豹芜澈
确保您当然要创建日志表。在您的代码中,如果您在循环中执行许多操作,您可能只想每x次操作记录一次,例如:
请注意,自主事务将确保插入日志stmt,即使发生错误并且您回滚其他所有内容(因为它是一个单独的事务)。 希望这有助于...比dbms_output更好;)
芦歉竭皑
的次数与你在PL / SQL中所做的其他事件的比率。