我有一个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
我希望我的测试数据库init脚本验证在正确的情况下是否命中了失败的分支。
我可以在MySQL中做这个吗?
最佳答案
使用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;
请注意处理程序的作用域,以便在没有发生错误的情况下不处理第二个信号。
我认为没有
signalled
标志和后续测试的退出处理程序也可以工作,但我不确定出口是否是全局的,或者只是处理程序的范围。这让我想到我没有MySql数据库来测试这个,所以很抱歉有语法错误/错误。