Oracle儲存過程中的異常處理

2021-04-19 18:06:45 字數 2939 閱讀 1679

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 ...