2017-08-14 5 views
1

MariaDB信号がどのように動作するのかよくわかりません。は、mariadb exitストアドプロシージャのIF SIGNAL SQLSTATEとなりますか?

文字列を入力として受け取るストアドプロシージャがあります。私は有効な文字のためにその文字列をテストしています。無効な文字が見つかった場合は、そのエラーが無効であるという信号を送信したいと思います。 SIGNAL SQLSTATE '......' SET MESAGE_TEXT='......'が発生した場合、ストアドプロシージャはすぐに終了しますか?または、シグナルを発行する前に手順を完了しますか?

答えて

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'

関連する問題