当子查询失败时,我可以让MySQL成功吗?如果子查询成功,我可以失败吗?

时间:2016-04-28 00:12:20

标签: 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 个答案:

答案 0 :(得分: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数据库来测试这个,很抱歉任何语法错误/错误。

答案 1 :(得分:-1)

我不记得确切的具体内容,但如果某些事情在您的交易中失败,则使用start transaction and set autocommit and rollback的内容