2016-04-28 129 views
1

我有一個MySQL數據庫和一堆存儲過程。如果子查詢失敗,可以讓MySQL成功嗎?如果子查詢成功,我可以失敗嗎?

我有一個測試SQL文件,它調用存儲過程來檢查它們在樣本數據上是否成功,並使用示例記錄填充測試數據庫。

我也想有一組語句其中,在僞代碼,將

SELECT (CALL SomeProc('invalid argument') EMITS ERROR) AS SomeProcCheck; 

在這個假想的例子,SomeProc寫成

CREATE STORED PROCEDURE SomeProc (arg TEXT) 
BEGIN 
    IF (IsNotValid(arg)) 
    THEN 
     SIGNAL SQLSTATE '45000'; 
    END IF; 
    INSERT INTO Foo (...); 
END 

我希望我的測試數據庫初始化腳本來驗證失敗分支在正確的情況下被擊中。

我可以在MySQL中執行此操作嗎?

回答

2

使用a continue handle和狼吞虎嚥的錯誤,如果你調用成功,然後發出一個錯誤信號:

DECLARE signalled INT DEFAULT 0; 

BEGIN 
    DECLARE CONTINUE HANDLER FOR SQLSTATE '45000' 
    BEGIN 
    SET signalled = 1; 
    END; 
    CALL SomeProc('invalid argument'); 
END 
IF (signalled = 0) 
THEN 
    SIGNAL SQLSTATE '45000'; 
END IF; 

請注意處理程序的範圍,以便在錯誤情況未發生時不處理第二個SIGNAL。 我認爲沒有signalled標誌和後續測試的退出處理程序也可以工作,但是我不確定退出程序是全局程序還是隻是處理程序的作用域......這使我得不到MySql數據庫測試這個如此抱歉的任何語法錯誤/錯誤。

+0

謝謝。是否有一個版本可以捕獲所有錯誤,而不管SQLSTATE?或者一個範圍,例如SQLSTATE> 45000? – spraff

+0

查看鏈接的參考。你可能想要:DECLARE CONTINUE HANDLER FOR SQLEXCEPTION –

+0

SQLSTATES是文字('45000','42S01'等,參見http://dev.mysql.com/doc/refman/5.5/en/error-messages-server.html ),並且不支持將它們與比較運算符分組成類。您唯一的選擇是SQLSTATE'45000',SQLSTATE'42S01',SQLSTATE ....的DECLARE CONTINUE HANDLER ....如果SQLEXTENTION過於寬泛。由於這是一個單元測試,您實際上只需要測試一個SQLSTATE,因爲您知道該測試應該拋出什麼錯誤。 –

-1

我不記得確切沿start transaction and set autocommit and rollback線的具體,但使用的東西,如果事情無法進入你的交易