當前位置:首頁 » 服務存儲 » 存儲過程異常處理
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

存儲過程異常處理

發布時間: 2022-02-07 01:52:12

『壹』 如何在sql存儲過程中處理錯誤

1. 建立一個過程,第一個語句 DECLARE EXIT HANDLER是用來處理異常的,意思是如果錯誤 1216發生,這個程序將會在錯誤記錄表中插入一行,
EXIT的意思是 當動作成功提交後推出這個復合語句。
create procere p22(parameter int)
begin
declare exit Handler for 1452
insert into error_log values(concat('Time: ',current_date,'.Foreign key reference failure for value=',parameter));
insert into t3 values(parameter);
end;//
2. 申明異常處理的語法 DECLARE HANDLER syntax:
DECLARE {EXIT|CONTINUE} HANDLER FOR {error_number|{SQLSTATE error-string}|condition} SQL Statement
上面就是錯誤處理的用法,也就是一段當程序出錯後自動觸發的代碼,MYSQL允許兩種處理器,一種是exit處理,另外一種是 continue處理,與exit
不同的是在於他執行後,原主程序仍然繼續運行,那麼該復合語句就沒有出口了。
----continue處理的例子:
create table t4(s1 int primary key);//
create procere p23()
begin
declare continue handler for SQLSTATE '23000' set @x2=1;
set @x=1;
insert into t4 values (1);
set @x=2;
insert into t4 values(1);
set @x=3;
select @x, @x2;
end;//
call p23();//
---- rollback(回滾事務),定義自己的錯誤處理名字 declare '錯誤處理名' condition for SQLSTATE'23000';
create procere p24()
begin
declare ViolationSelf condition for SQLSTATE'23000';
DECLARE EXIT HANDLER for ViolationSelf rollback;
start transaction;
insert into t2 values(1);
insert into t2 values(1);
commit;
end;//

/******************************************** Cursor游標 **********************************************************/
游標實現功能的摘要: 聲明游標, 打開游標,從游標里讀取,關閉游標
DECLARE cursor-name CURSOR FOR SELECT ······
OPEN cursor-name;
FETCH cursor-name INTO variable;
CLOSE cursor-name;
1. create procere p25(out return_val int)
begin
DECLARE a,b,c int;
DECLARE cur_1 CURSOR for select s1 from t;
DECLARE continue handler for not found set b=1;
open cur_1;
set c=0;
repeat
fetch cur_1 into a;
until b=1
end repeat;
close cur_1;
set return_val=a;
end;//
2. create procere p25_1(out return_val int)
begin
DECLARE a,b,c int;
DECLARE cur_1 CURSOR for select s1 from t;
DECLARE continue handler for not found set b=1;
open cur_1;
set c=0;
lable_1:loop
fetch cur_1 into a;
if b=1 then
leave lable_1;
end if;
set c=c+1;
end loop;
close cur_1;
set return_val=c;
end;//
create procere p34(in va int)
begin
delete from t where s1=va;
end;//

『貳』 存儲過程觸發異常後可不可以繼續執行

把可能拋出異常的部分另外寫一個單獨的過程。
並且是具備異常處理能力的,如果你不想作什麼處理,可以在when others then下面寫一個null;就可以了。
這樣異常發生時,在本過程內就處理掉了,異常沒有被傳播(就是拋到調用者那裡)。

『叄』 mysql的存儲過程中如何定義錯誤處理

declare是用來定義變數和常用處理、聲明之類的關鍵字。在mysql存儲過程出現之前declare是一塊雞肋,大家常用declare來定義局部變數,我習慣性的還是使用set來定義變數(雖然是全局的,但是來的方便)。 存儲過程出現後declare的標准處理定義就變成了非常強大的工具,可以用來為存儲過程添加一些非常強大的錯誤處理機制。 首先需要提一點的是declare定義變數如果想定義varchar型的,必須註明參數最大長度,即declare varchar(20). 在這里我們不深究它用來定義參數的小細節 我們主要來研究DECLARE Condition 和 DECLARE Handler DECLARE Condition 和 DECLARE Handler可以說是為了處理錯誤而生的。 功能上講DECLARE Condition出現的時間比較早,功能也比較簡單,它可以通過錯誤編號或者SQLSTATE來觸發一各名字,說明白一點就是當某個錯誤編號出現的時候替換一個名字給它。這樣調用的時候,我們不用去記一大串錯誤編號了。 它的標准語法我們可以在mysql的附註中找到。 DECLARE condition_name CONDITION FOR condition_value condition_value:例子如下:DECLARE errname CONDITION FOR SQLSTATE '23000' 將返回SQLSTATE信息為23000的錯誤定名為errname 這個名字就可以被我們的絕對重頭戲DECLARE Handler調用了,在DECLARE Handler中可以定義錯誤的處理辦法,可以使用begin和end來標記語句塊,可以單獨使用rollback。處理的過程也可以定義為繼續執行和中斷存儲過程。 標准語法:DECLARE handler_type HANDLER FOR condition_value[,...] sp_statement handler_type: 處理的過程。 CONTINUE 繼續執行未完成的存儲過程,直至結束。(常用,默認) | EXIT 出現錯誤即自動跳出所在的begin不再執行後面的語句。 condition_value: 處理的觸發條件 SQLSTATE [VALUE] sqlstate_value 不用說了,最常用的錯誤定義,自己去查錯誤列表吧。 | condition_name 我們剛剛定義的那個名字errnmae就是用在這里的。 | SQLWARNING 這個太好用了,從錯誤編號01開始的錯誤。相當於錯誤的通配符。 | NOT FOUND 和上面差不多,從02開始。 | SQLEXCEPTION 上面兩個中沒有包括的錯誤它都可以用來觸發,就是說你想定義只要出錯就觸發的話就定義出錯條件為SQLWARNING+SQLEXCEPTION。 | mysql_error_code 錯誤編號,和第一個不一樣,不過同樣可以在錯誤列表從中查到,是我比較常用的。 例子DECLARE errname CONDITION FOR SQLSTATE '23000'; 給導致錯誤23000的錯誤定義名字為errname DECLARE continue handler for errname 當errname發生時作下面的處理 BEGIN 語句開始 set @x=1; 設置@x=1

『肆』 oracle 存儲過程中出現異常的處理

異常是執行這個存儲過程出的異常吧,那就是說只有執行一次這個存儲過程才會拋一次異常么?如果這樣我建議你可以再寫個存儲過程來調用你這個存儲過程,這樣來記錄異常的次數。然後再進行處理!

『伍』 oracle存儲過程,怎麼控制是否做異常處理。

動態sql可以做吧。
exception外面參數判斷,走不走exception在動態sql里做。
另外我想問下,exception不是會導致程序中斷退出嗎?為什麼不在exception里做參數判斷呢?當不需要走exception的時候,將異常處理設置為 null;,需要的話就走異常處理。

『陸』 請教各位高手 oracle 存儲過程 如何獲得 捕獲異常的內容

--通過sqlcode , sqlerrm 這兩個內置變數來查看,例如:

DECLARE
--聲明異常
some_kinds_of_err EXCEPTION; -- Exception to indicate an error condition

v_ErrorCode NUMBER; -- Variable to hold the error message code
v_ErrorText VARCHAR2(200); -- Variable to hold the error message text

BEGIN
--...
--拋出異常
IF ( ... ) THEN --(括弧內填拋出異常的條件)
RAISE some_kinds_of_err;
END IF;
--...
EXCEPTION
--捕捉異常
WHEN some_kinds_of_err THEN
/* do something to Handler the errors */
null;
--捕捉其他異常,並獲得 捕獲異常的內容
WHEN OTHERS THEN
v_ErrorCode := SQLCODE;
v_ErrorText := SUBSTR(SQLERRM, 1, 200);
-- Note the use of SUBSTR here.

dbms_output.put_line(v_ErrorCode || '::'||v_ErrorText);
END;
/

/**
sqlcode 就是錯誤代碼
sqlerrm 就是sql錯誤信息。注意用substr來截取,否則輸出很難看。

**/

『柒』 db2的過程中怎樣寫異常處理

CREATEPROCEDUREschema_name.proc_name
(
INparm1INTEGER,OUTparm2VARCHAR(1000)
)
SPECIFICPROC_YYZY_XYKCJZ
LANGUAGESQL
NOTDETERMINISTIC
NOEXTERNALACTION
MODIFIESSQLDATA
CALLEDONNULLINPUT
LB_MAIN:BEGINATOMIC
/*DECLARESYSTEMVARIABLES*/
DECLARESQLSTATECHAR(5);
DECLARESQLCODEINTEGER;
DECLAREV_SQLSTATECHAR(5);
DECLAREI_SQLCODEINTEGER;
DECLARESQL_CUR_AT_ENDINTEGER;
DECLARESQL_STMTVARCHAR(2000);
/*DECLAREUSER-DEFINEDVARIABLES*/
--DECLAREV_SEPARATORVARCHAR(50)DEFAULT',';
/*DECLARESTATICCURSOR*/
--DECLAREC1CURSOR/*WITHRETURN*/FOR
--SELECTcolumn1,column2...
--FROMtable_name
--ORDERBYcolumn1,column2...
--;
/*DECLAREDYNAMICCURSOR*/
--DECLAREC2CURSORFORS2;
/*DECLAREEXCEPTIONHANDLE*/
--異常聲明
BEGIN
VALUES(SQLCODE,SQLSTATE)INTOI_SQLCODE,V_SQLSTATE;
SETparm2=VALUE(parm2,'')
||'SYSTEM:SQLCODE='||RTRIM(CHAR(I_SQLCODE))
||',SQLSTATE='||VALUE(RTRIM(V_SQLSTATE),'')||';'
;
END;
_CUR_AT_END=1;
/*DECLARETEMPORARYTABLE*/
--
--(
--columnINTEGER
--);

/*SQLPROCEDUREBODY*/

ENDLB_MAIN;

上面的是我常用的一個存儲過程的代碼樣本



異常處理需要加在游標聲明之後,臨時表聲明之前(見DECLARE UNDO HANDLER FOR SQLEXCEPTION部分)



常用的異常處理方式分為三種:UNDO(回滾)、EXIT(退出)、CONTINUE(繼續執行)

DECLAREUNDO|EXIT|CONTINUEHANDLERFOR



異常處理的對象可以為針對指定的sqlstate代碼

DECLAREUNDO|EXIT|

也可以針對某些condition,如sql異常,sql警告,以及游標末尾

DECLAREUNDO|EXIT||SQLWARNING|NOTFOUND




異常處理的內容 ,可以是一些回滾,提交語句,也可以是日誌記錄等

DECLAREUNDO|EXIT|
BEGIN
--異常處理內容
END;



引用資料:http://publib.boulder.ibm.com/infocenter/db2luw/v9r7/topic/com.ibm.db2.luw.sql.ref.doc/doc/r0004239.html

『捌』 oracle 存儲過程異常處理

先建一個錯誤跟蹤表
create sequence s_error_id;
CREATE TABLE ERROR_RECORD
(
ERROR_ID NUMBER(10) primary key,
ERROR_CODE NUMBER(10),
ERROR_MSG VARCHAR2(2000),
ERROR_DATE DATE,
ERROR_PROGRAM VARCHAR2(200)
);
--------在過程的例外里向跟蹤表寫入錯誤信息:
create or replace procere day_task is
v_sqlcode ERROR_RECORD.ERROR_CODE%type;
v_msg ERROR_RECORD.error_msg%type;
begin
------program body
exception when others then
--記錄錯誤信息表
v_sqlcode :=sqlcode;
v_msg :=sqlerrm;
insert into error_record(error_code,error_msg,error_date,error_program)
values (v_sqlcode,v_msg,sysdate,『day_task』);
end;

『玖』 怎樣判斷存儲過程出錯並捕捉錯誤信息

--通過sqlcode , sqlerrm 這兩個內置變數來查看,例如:

DECLARE
--聲明異常
some_kinds_of_err EXCEPTION; -- Exception to indicate an error condition

v_ErrorCode NUMBER; -- Variable to hold the error message code
v_ErrorText VARCHAR2(200); -- Variable to hold the error message text

BEGIN
--...
--拋出異常
IF ( ... ) THEN --(括弧內填拋出異常的條件)
RAISE some_kinds_of_err;
END IF;
--...
EXCEPTION
--捕捉異常
WHEN some_kinds_of_err THEN
/* do something to Handler the errors */
null;
--捕捉其他異常,並獲得 捕獲異常的內容
WHEN OTHERS THEN
v_ErrorCode := SQLCODE;
v_ErrorText := SUBSTR(SQLERRM, 1, 200);
-- Note the use of SUBSTR here.

dbms_output.put_line(v_ErrorCode || '::'||v_ErrorText);
END;
/

/**
sqlcode 就是錯誤代碼
sqlerrm 就是sql錯誤信息。注意用substr來截取,否則輸出很難看。

**/

『拾』 MYSQL 存儲過程 中怎麼捕獲異常

DECLARE處理程序的使用:

DECLARE handler_type HANDLER FOR condition_value[,...] sp_statement

其中,

handler_type的取值范圍:CONTINUE | EXIT | UNDO

condition_value的取值范圍:SQLSTATE [VALUE] sqlstate_value | condition_name | SQLWARNING | NOT FOUND | SQLEXCEPTION | mysql_error_code

這個語句指定每個可以處理一個或多個條件的處理程序。如果產生一個或多個條件,指定的語句被執行。對一個CONTINUE處理程序,當前子程序的執行在執行處理程序語句之後繼續。對於EXIT處理程序,當前BEGIN...END復合語句的執行被終止。UNDO 處理程序類型語句還不被支持。

· SQLWARNING是對所有以01開頭的SQLSTATE代碼的速記。

· NOT FOUND是對所有以02開頭的SQLSTATE代碼的速記。

· SQLEXCEPTION是對所有沒有被SQLWARNING或NOT FOUND捕獲的SQLSTATE代碼的速記。

註:除了SQLSTATE值,MySQL錯誤代碼也不被支持。


例:

[sql]viewplainprint?
delimiter$$

CREATETABLE`_t1`(
`id`int(11)NOTNULLAUTO_INCREMENT,
`val1`varchar(20)DEFAULTNULL,
`val2`int(11)DEFAULTNULL,
PRIMARYKEY(`id`)
)ENGINE=InnoDBAUTO_INCREMENT=113DEFAULTCHARSET=latin1$$
[sql]viewplainprint?
DELIMITER$$

CREATEDEFINER=`abandonship`@`%`PROCEDURE`P_TestException`()
BEGIN
declare_var,_errintdefault0;
,sqlwarning,notfoundset_err=1;
insertinto_t1(val1,val2)value(2012,'abandonship');
if_err=1then
set_var=2;
endif;

selectcasewhen_var=2then'出錯了'else_varend;

調用該存儲過程將返回:出錯了