我有一个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数据库来测试这个,所以很抱歉有语法错误/错误。

10-06 05:16