将IF SIGNAL SQLSTATE在mariadb中退出存储过程吗?

时间:2017-08-14 14:40:22

标签: stored-procedures signals mariadb

我不太明白MariaDB如何发挥作用。

我有一个以字符串作为输入的存储过程。我正在测试有效字符的字符串。如果找到无效字符,那么我想发送错误无效的信号。如果引发SIGNAL SQLSTATE '......' SET MESAGE_TEXT='......',存储过程是否会立即退出?或者它会在发出信号之前完成程序吗?

1 个答案:

答案 0 :(得分:1)

仅使用IF...THEN语句时,它似乎无效。

CREATE PROCEDURE `testP`()
BEGIN
IF testStringSecurity('he;llo world') != 0 THEN
  SELECT 'INVALID CHARACTERS';
END IF;
SELECT 'GOOD TO GO'; 
END;

始终返回GOOD TO GO。看来你必须像IF ... THEN ... ELSE这样包装以获得有效的案例。虽然设置信号是不同的。

CREATE PROCEDURE `testP`()
BEGIN
IF testStringSecurity('he;llo') != 0 THEN
  SELECT 'INVALID CHARACTERS';
ELSE
  SELECT 'GOOD TO GO';
END IF;
END

使用SIGNAL确实会立即中断执行。

CREATE PROCEDURE `testP`()
BEGIN
DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
GET DIAGNOSTICS CONDITION 1 @sqlstate = RETURNED_SQLSTATE, 
      @errno = MYSQL_ERRNO, @text = MESSAGE_TEXT; 
        SET @full_error = CONCAT("ERROR ", @errno, " (", @sqlstate, "): ", @text); 
        SELECT @full_error;
END;
DECLARE EXIT HANDLER FOR NOT FOUND
BEGIN
  SELECT CONCAT('ERROR: ',@str,' RETRUNED NOT FOUND EXCEPTION.');
END;
IF testStringSecurity('he;llo') != 0 THEN
    SIGNAL SQLSTATE '42000'
      SET MESSAGE_TEXT = 'ERROR: Invalid string';
END IF;

SELECT 'GOOD TO GO';
END

返回'ERROR 1644 (42000): ERROR: Invalid string'