程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> 關於MYSQL數據庫 >> MySQL 5.0 新特性教程 存儲過程:第四講

MySQL 5.0 新特性教程 存儲過程:第四講

編輯:關於MYSQL數據庫

1. Sample Problem: Log Of Failures 問題樣例:故障記錄

  當INSERT失敗時,我希望能將其記錄在日志文件中我們用來展示出錯處理的問題樣例是很
普通的。我希望得到錯誤的記錄。當INSERT失敗時,我想在另一個文件中記下這些錯誤的
信息,例如出錯時間,出錯原因等。我對插入特別感興趣的原因是它將違反外鍵關聯的約束

2. Sample Problem: Log Of Failures (2)


MySQL> CREATE TABLE t2
s1 INT, PRIMARY KEY (s1))
engine=innodb;//
MySQL> CREATE TABLE t3 (s1 INT, KEY (s1),
FOREIGN KEY (s1) REFERENCES t2 (s1))
engine=innodb;//
MySQL> INSERT INTO t3 VALUES (5);//
...
ERROR 1216 (23000): Cannot add or update a child row: a foreign key
constraint fails(這裡顯示的是系統的出錯信息)

  我開始要創建一個主鍵表,以及一個外鍵表。我們使用的是InnoDB,因此外鍵關聯檢查是打
開的。然後當我向外鍵表中插入非主鍵表中的值時,動作將會失敗。當然這種條件下可以很
快找到錯誤號1216。

3. Sample Problem: Log Of Failures


CREATE TABLE error_log (error_message
CHAR(80))//

  下一步就是建立一個在做插入動作出錯時存儲錯誤的表。

4. Sample Problem: Log Of Errors


CREATE PROCEDURE p22 (parameter1 INT)
BEGIN

DECLARE EXIT HANDLER FOR 1216
INSERT INTO error_log VALUES
(CONCAT('Time: ',current_date,
'. Foreign Key Reference Failure For
Value = ',parameter1));
INSERT INTO t3 VALUES (parameter1);
END;//

  上面就是我們的程序。這裡的第一個語句DECLARE EXIT HANDLER是用來處理異常的。意思是如果錯誤1215發生了,這個程序將會在錯誤記錄表中插入一行。EXIT意思是當動作成功提交後退出這個復合語句。

5. Sample Problem: Log Of Errors


CALL p22 (5) //

  調用這個存儲過程會失敗,這很正常,因為5值並沒有在主鍵表中出現。但是沒有錯誤信息
返回因為出錯處理已經包含在過程中了。t3表中沒有增加任何東西,但是error_log表中記錄
下了一些信息,這就告訴我們INSERT into table t3動作失敗。


DECLARE HANDLER syntax 聲明異常處理的語法


DECLARE
{ EXIT | CONTINUE }
HANDLER FOR
{ error-number | { SQLSTATE error-string } | condition }
SQL statement

  上面就是錯誤處理的用法,也就是一段當程序出錯後自動觸發的代碼。MySQL允許兩種處理器,一種是EXIT處理,我們剛才所用的就是這種。另一種就是我們將要演示的,CONTINUE處理,它跟EXIT處理類似,不同在於它執行後,原主程序仍然繼續運行,那麼這個復合語句就沒有出口了。

1. DECLARE CONTINUE HANDLER example CONTINUE處理例子


CREATE TABLE t4 (s1 int,primary key(s1));//
CREATE PROCEDURE 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;
END;//

  這是MySQL參考手冊上的CONTINUE處理的例子,這個例子十分好,所以我把它拷貝到這裡。
  通過這個例子我們可以看出CONTINUE處理是如何工作的。

2. DECLARE CONTINUE HANDLER聲明CONTINUE異常處理


CREATE TABLE t4 (s1 int,primary key(s1));//
CREATE PROCEDURE 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;
END;//

  這次我將為SQLSTATE值定義一個處理程序。還記得前面我們使用的MySQL錯誤代碼1216嗎?
  事實上這裡的23000SQLSTATE是更常用的,當外鍵約束出錯或主鍵約束出錯就被調用了。


3. DECLARE CONTINUE HANDLER


CREATE TABLE t4 (s1 int,primary key(s1));//
CREATE PROCEDURE 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;
END;//

  這個存儲過程的第一個執行的語句是"SET @x = 1"。

4. DECLARE CONTINUE HANDLER example


CREATE TABLE t4 (s1 int,primary key(s1));//
CREATE PROCEDURE 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); <--

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved