㈠ 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;
調用該存儲過程將返回:出錯了
㈡ db2如何捕獲存儲過程異常
TRUNCATETABLEoutput_debugIMMEDIATE@
BEGIN
--DB2中,如果需要使用sqlcode,那麼必須先DECLARE以後,才能使用。
DECLAREsqlcodeINT;
P1:BEGINATOMIC
--定義錯誤處理
--如果發生錯誤,結束處理,並回滾前面做的處理。
DECLAREUNDOHANDLER
FOR
SQLEXCEPTION
BEGIN
--異常處理
INSERTINTOoutput_debugVALUES('出錯啦!'||TO_CHAR(sqlcode));
END;
--先更新.
UPDATEtest_mainSETvalue='Test3'WHEREid=1;
--插入一行主鍵重復數據.
INSERTINTOtest_mainVALUES(1,'PK');
INSERTINTOoutput_debugVALUES('本語句不會執行到!');
ENDP1;
END
@
db2=>select*fromtest_mainWHEREid=1@
IDVALUE
---------------------
1Test2
1條記錄已選擇。
db2=>select*fromoutput_debug@
DATA
----------------------------------------
出錯啦!-803
㈢ 請教各位高手 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來截取,否則輸出很難看。
**/
㈣ oracle 存儲過程如何捕獲特定異常
條件改成下面的。
if sqlcode=-1427
㈤ 請教各位高手 oracle 存儲過程 如何將獲得捕獲異常的內容寫入一張表裡
可以先定義個變數,發生異常的時候將異常信息賦值給變數,插入表的時候用變數,
日誌表沒給表結構,我自己重新定義了一個,測試ok。
CREATE TABLE T_LOG_ERROR
(ERR_ID NUMBER,
ERR_TIME DATE,
ERR_CODE NUMBER,
ERR_INFOR VARCHAR2(4000)
);
create or replace procere p_testone is
v number(2);
v_sqlcode number;
v_sqlerrm varchar2(4000);
begin
select 1 / 0 into v from al;
--異常處理
EXCEPTION WHEN OTHERS THEN
ROLLBACK;
v_sqlcode :=sqlcode;
v_sqlerrm :=SUBSTR(sqlerrm, 1, 2000);
insert into t_log_error values(1,sysdate,v_sqlcode,v_sqlerrm);
commit;
DBMS_OUTPUT.PUT_LINE(SUBSTR(SQLERRM, 1, 200));
end;
執行存儲過程後就可以把異常信息記錄到表t_log_error了。
㈥ 求助,存儲過程如何捕獲異常後繼續執行,
這個要看異常捕捉處理程序放在哪,從出現異常到異常處理之間的程序應該是不執行的
㈦ 存儲過程怎麼捕捉違反唯一性約束的異常
BEGIN TRY---------------------開始捕捉異常
...
END TRY-----------結束捕捉異常
BEGIN CATCH------------有異常被捕獲
-----------異常處理,一般有事務先回滾
IF @@TRANCOUNT > 0---------------判斷有沒有事務
BEGIN
ROLLBACK TRAN----------回滾事務
END
....
END CATCH--------結束異常處理
㈧ 怎樣判斷存儲過程出錯並捕捉錯誤信息
--通過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來截取,否則輸出很難看。
**/
㈨ 如何讓存儲過程拋出異常
你說的異常是什麼意思?如果是,執行中的錯誤,那麼可以用「調試」,不過需要有一個系統許可權的擁護才能調試,許可權好象是什麼debug XXXXX。 如果說的是有時執行因為這樣那樣的數據問題出現的異常,那麼一般都是通過exception來拋出異常的,這樣的拋出的異常,你可以自己編代碼,然後輸入一張表內,這樣就可以捕獲異常了。如果1表示沒有主鍵,2表示數據超長等等。具體的寫法網上很多,這里就不寫了。