Mysql的儲存過程中的異常

2021-04-12 19:02:52 字數 3927 閱讀 6773

以前看到一篇mysql的儲存過程,覺得很簡單:

要使用mysql的儲存過程,需要:

1、mysql的版本在5.0以上,低版本的海不支援儲存過程;

2、資料表應該是innodb的,其他格式的不支援事務;

做乙個實驗:建立兩個表,在儲存過程中向兩個表插入資料,使向第一表的插入操作執行成功,向第二個表的操作執行失敗。然後儲存過程應rollback,回滾到最初狀態:兩個表的資料都是空的。

第一步,建立表兩個資料表:

drop tableifexists test1;

create table test1(

achar(1)

)engine=innodb;

drop tableifexists test2;

create table test2(

aint

)engine=innodb;

這樣,如果想第二個表插入乙個字元型的資料,肯定會插入失敗。

第二步,建立儲存過程:

delimiter //

drop procedureifexists sp_test//

create procedure sp_test( )

begin

declare exit handler for sqlexception rollback;

start transaction;

insert into test1 values('a');

insert into test2 values('a');

commit;

end//

delimiter ;

因為在儲存過程中,語句間的分隔符號是「;」,那麼在建立儲存過程的時候,需要先宣告分隔符號是其他的符號,以避免在儲存過程建立的過程中被mysql解釋執行,所以預先將分隔符號設定為「//」,儲存過程建立成功後,再設定回來。

關於對delimiter的理解,做幾個小的實驗就知道了。

第三步,執行,看結果:

mysql> drop tableifexists test1;

query ok, 0 rows affected (0.04 sec)

mysql> create table test1(

->     achar(1)

-> )engine=innodb;

query ok, 0 rows affected (0.10 sec)

mysql>

mysql> drop tableifexists test2;

query ok, 0 rows affected (0.04 sec)

mysql> create table test2(

->     aint

-> )engine=innodb;

query ok, 0 rows affected (0.08 sec)

mysql>

mysql>

mysql> delimiter //

mysql> drop procedureifexists sp_test//

query ok, 0 rows affected, 1 warning (0.00 sec)

mysql> create procedure sp_test(

-> )

->

-> begin

->     declare exit handler for sqlexception rollback;

->     start transaction;

->     insert into test1 values('a');

->     insert into test2 values('a');

->     commit;

-> end

-> //

query ok, 0 rows affected (0.00 sec)

mysql> delimiter ;

mysql>

mysql> select * from test1;

empty set (0.01 sec)

mysql> select * from test2;

empty set (0.00 sec)

mysql> call sp_test();

query ok, 0 rows affected (0.03 sec)

mysql> select * from test1;

empty set (0.00 sec)

mysql> select * from test2;

empty set (0.00 sec)

mysql>

這裡面mysql遇到sqlexception後,回滾了整個事務。

接下來,可以修改儲存過程中的語句,讓第二個插入過程是可以正確執行的,再次執行儲存過程,可以看到mysql會commit資料。 

執行中卻發現我的結果不是這樣!而是如下

mysql

>

delimiter 

//mysql

>

drop procedure sp_test

//error 

1305

(42000

): procedure test.sp_test does not exist

mysql

>

create procedure sp_test(

->

)->

begin

->

declare exit handler 

forsqlexception rollback;

->

start transaction;

->

insert into test1 values('a

');->

insert into test2 values('a

');->

commit;

->

end->

//query ok, 

0rows affected (

0.01

sec)

mysql

>

delimiter ;

mysql

>

call sp_test();

query ok, 

0rows affected, 

1warning (

0.03

sec)

mysql

>

select 

*from test1;

+------+

|a    

|+------+

|a    

|+------+

1row 

inset

(0.00

sec)

mysql

>

select 

*from test2;

+------+

|a    

|+------+|0

|+------+

1row 

inset

(0.00

sec)

很是奇怪,呵呵!後來才發現原來我把mysql 的php.ini的語法限制給去掉了!

# sql

-mode="

strict_trans_tables,no_auto_create_user,no_engine_substitution"

此處的被遮蔽了,就變成都可以插入.把它改回去就行了!

mysql儲存過程中的異常處理

定義異常捕獲型別及處理方法 declarehandler action handler for condition value condition value statement handler action continue exit undo condition value mysql erro...

mysql儲存過程中的異常處理

定義異常捕獲型別及處理方法 declarehandler action handler for condition value condition value statement handler action continue exit undo condition value mysql erro...

Oracle儲存過程中的異常處理

1.問題 oracle中可以用dbms output.put line來列印提示資訊,但是很容易緩衝區就溢位了。可以用dbms output.enable 1000000 來設定緩衝區的大小。但是有大小,就有可能再溢位 程式寫得太爛,錯誤不斷,不好意思 於是想把異常資訊寫到乙個表中。2.建表 這個容...