2016-04-28 17 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; 

ハンドラのスコープに注意して、エラー状態が発生しなかった場合に2番目のSIGNALを処理しないようにします。 signalledフラグのない終了ハンドラとそれに続くテストもうまくいくと思いますが、終了がグローバルかハンドラのスコープかどうかはわかりません...これは私にMySql db構文エラー/バグのためにこのことを申し訳ありません。

+0

ありがとうございました。 SQLSTATEに関係なくすべてのエラーをキャプチャするバージョンがありますか?または、範囲など。 SQLSTATE> 45000? – spraff

+0

リンクされた参照を見てください。あなたはおそらく望んでいます:SQLEXCEPTIONのためのDECLARE CONTINUE HANDLER –

+0

SQLSTATESはリテラルです( '45000'、 '42S01'など)。http://dev.mysql.com/doc/refman/5.5/en/error-messages-server.htmlを参照してください。 )、それらを比較演算子を持つクラスにグループ化することはサポートされていません。他の唯一のオプションは、SQLEXTENTIONが余りに包括的である場合、SQLSTATE '45000'、SQLSTATE '42S01'、SQLSTATE ....のDECLARE CONTINUE HANDLERです。これは単体テストなので、実際にこのテストで発生するエラーを知った後、単一のSQLSTATEをテストしたいと思っています。 –

-1

私は何かがあなたの取引に失敗した場合、正確に特異的であるがstart transaction and set autocommit and rollbackの線に沿って何かを使用して覚えていけない

関連する問題