MySQL存儲過程使用及異常處理

批量向權限表插入數據
Mysql 中,單個 Store Procedure(SP) 不是原子操作,而 oracle 則是原子的。所以Mysql需要自己控制事務的開啓與提交。
在mysql中如果不適用過程,直接
sql:insert into t_rbac_role_node(role_id,node_id) values(3,4),(3,5),(3,3);
如果一條插入信息有問題,就會全部插入失敗。所以要根據情況看使用什麼方式。

存儲過程

DROP PROCEDURE
IF
	EXISTS proc_general_role;

DELIMITER $
CREATE PROCEDURE proc_general_role ( 
IN roleId INT, 
IN beginIndex INT, #node_id的初始值
IN endIndex INT,#node_id的結束值,包含關係
out  vReturnValue varchar(500),
out  iResult int
) 
BEGIN
#聲明異常
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION 
#捕獲異常
CAT:BEGIN
GET DIAGNOSTICS CONDITION 1
iResult = RETURNED_SQLSTATE, vReturnValue = MESSAGE_TEXT;
END;
	START TRANSACTION;
WHILE
beginIndex <= endIndex DO
		 INSERT INTO t_rbac_role_node (role_id, node_id)VALUES( roleId, beginIndex );
		SET beginIndex = beginIndex + 1;
END WHILE;
	COMMIT;
END $
DELIMITER ;
CALL proc_general_role ( 4, 1, 15,@ReturnValue, @Result);
select @Result;
select @ReturnValue;



異常

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

上述定義包括:
Handler Type (CONTINUE,EXIT)//處理類型 繼續或退出
Handler condition (SQLSTATE,MYSQL ERROR,CONDITION)//觸發條件
Handler actions(錯誤觸發的操作)
注意:
1、exit只退出當前的block。exit 意思是當動作成功提交後,退出所在的複合語句。即declare exit handler for… 所在的複合語句。
2、如果定義了handler action,會在continue或exit之前執行
發生錯誤的條件有:
1、MYSQL錯誤代碼
2、ANSI-standard SQLSTATE code
3、命名條件。可使用系統內置的SQLEXCEPTION,SQLWARNING和NOT FOUND

DECLARE EXIT HANDLER FOR SQLEXCEPTION 語句後面可以跟一個 begin end的複合語句塊,也可以直接跟一個簡單語句例如 :DECLARE EXIT HANDLER FOR SQLEXCEPTION v_succ=0;

獲取異常信息GET DIAGNOSTICS CONDITION

GET DIAGNOSTICS CONDITION 語句來獲取錯誤緩衝區的內容,然後把這些內容輸出到不同範圍域的變量裏,以便我們後續靈活操作

GET [CURRENT] DIAGNOSTICS
{
    statement_information_item
    [, statement_information_item] ... 
  | CONDITION condition_number
    condition_information_item
    [, condition_information_item] ...
}

statement_information_item:
    target = statement_information_item_name

condition_information_item:
    target = condition_information_item_name

statement_information_item_name:
    NUMBER
  | ROW_COUNT

condition_information_item_name:
    CLASS_ORIGIN
  | SUBCLASS_ORIGIN
  | RETURNED_SQLSTATE
  | MESSAGE_TEXT
  | MYSQL_ERRNO
  | CONSTRAINT_CATALOG
  | CONSTRAINT_SCHEMA
  | CONSTRAINT_NAME
  | CATALOG_NAME
  | SCHEMA_NAME
  | TABLE_NAME
  | COLUMN_NAME
  | CURSOR_NAME

condition_number, target:
    (see following discussion)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章