1.問題**
oracle中可以用dbms_output.put_line來列印提示資訊,但是很容易緩衝區就溢位了。
可以用dbms_output.enable(1000000);來設定緩衝區的大小。
但是有大小,就有可能再溢位(程式寫得太爛,錯誤不斷,不好意思)。
於是想把異常資訊寫到乙個表中。
2.建表
這個容易
create table werrorlog
(procedure_name varchar2(50) not null
,err_msg varchar2(255) not null
,sys_err_code varchar2(10) not null
,sys_err_msg varchar2(1000) not null
,create_time date not null
);comment on table werrorlog is 'log表,用於記錄儲存過程的錯誤';
comment on column werrorlog.procedure_name is '過程名,出錯的儲存過程或函式';
comment on column werrorlog.err_msg is '自定義出錯資訊';
comment on column werrorlog.sys_err_code is 'oracle系統的出錯**';
comment on column werrorlog.sys_err_msg is 'oracle系統的出錯資訊';
comment on column werrorlog.create_time is '錯誤發生時間';
3.儲存過程
create or replace procedure prc_err_log
(i_procedure_name varchar2
,i_err_msg varchar2
)--寫日誌的過程,albert song 2005-06-28
--注意本過程沒有進行commit或rollback操作
--用法
--exception
-- when others
-- then
-- rollbak;
-- prc_err_log('prc_err_log','寫日誌表錯誤');
-- commit;
asv_sqlcode varchar(10);
v_sqlerrm varchar(1000);
begin
v_sqlcode:=sqlcode;
v_sqlerrm:=sqlerrm;
insert into werrorlog values(i_procedure_name,i_err_msg,v_sqlcode,v_sqlerrm,sysdate);
exception
when others
then
v_sqlcode:=sqlcode;
v_sqlerrm:=sqlerrm;
insert into werrorlog values('prc_err_log','寫日誌表錯誤',v_sqlcode,v_sqlerrm,sysdate);
end;
4.使用
create or replace procedure prc_test
asv_data varchar2(255);
begin
insert into werrorlog values('prc,'錯誤','test','test',sysdate);
select err_msg into v_data from werrorlog where err_msg='no err msg';
exception
when others then
rollback;
prc_err_log('prc_test','測試prc_err_log');
commit;
end ;
5.測試
exec prc_test;
select * from werrorlog;
6.說明
為什麼不能在prc_err_log中commit?
目的是可以用在這樣的地方
create or replace procedure prc_test_transaction
asv_in varchar2(255);
begin
insert into testsql values('11','55');
if 1=1 then
begin
select code into v_in from testsql where code='12323';
exception
when others
then
prc_err_log('prc_test_transaction','testsql表中不存在code為12323的記錄');
end;
end if;
...commit;
exception
when others
then
rollback;
prc_err_log('prc_err_log','出現了未知的錯誤');
commit;
end ;
這種情況下,如果在第乙個prc_err_log處commit會將已經執行的操作提交了。
後記:我的目的只有乙個,就是詳細地記錄程式的執行過程,最好是能知道哪一行程式出了異常。現在可以在err_msg裡記錄一些自定義的變數來跟蹤程式狀態了。
剛學oracle不久,我覺得應該有更好的方法,但是我沒有找到,自己也沒有創造出來。
dbms_output有個new_line不知是不是可以防止緩衝區溢位呢?
Oracle 儲存過程中自定義異常
參考 oracle 使用者自定義異常小例子 oracle中raise異常深入分析 customize exp exception 自定義異常 begin for c in select d.from scott.dept d loop begin dbms output.put line dept ...
Mysql的儲存過程中的異常
以前看到一篇mysql的儲存過程,覺得很簡單 要使用mysql的儲存過程,需要 1 mysql的版本在5.0以上,低版本的海不支援儲存過程 2 資料表應該是innodb的,其他格式的不支援事務 做乙個實驗 建立兩個表,在儲存過程中向兩個表插入資料,使向第一表的插入操作執行成功,向第二個表的操作執行失...
儲存過程中異常的使用 示例
儲存過程中異常的使用 示例 create or replace procedure update sal e name in varchar2,e sal in number is 宣告異常 not found exception begin 更改指定ename對應的工資 update emp e ...