为什么我的存储过程中的事务不会打印出我想要的错误消息?

时间:2017-04-17 14:03:50

标签: mysql transactions rollback

USE COLLEGE; 


DROP PROCEDURE IF EXISTS Fix_Egghead1;

DELIMITER $$

 CREATE PROCEDURE Fix_Egghead1()
BEGIN
    -- Setup error handing
    DECLARE errorOccurred INT DEFAULT FALSE;
    DECLARE errorMessage VARCHAR(255);

    -- Called when an error occurs 
    DECLARE CONTINUE HANDLER FOR SQLEXCEPTION 
    BEGIN 
        SET errorOccurred = TRUE;
        GET DIAGNOSTICS CONDITION 1
            errorMessage = MESSAGE_TEXT;

    END ;

       START TRANSACTION;

                 DELETE FROM Student
                 WHERE Student.ID= 57; 

           INSERT INTO Faculty(LastName, FirstName, Email, HireDate, Salary, DepartmentID) 
           VALUES('Egghead', 'Eduardo', 'EduardoEgghead@College.edu', 115000, 1);



       IF errorOccurred = TRUE THEN
        ROLLBACK;
        SELECT  CONCAT( 'The faculty member wasn't succesfully added to the Faculty table:' ,  errorMessage) AS Results; 
    ELSE
        COMMIT;
        SELECT 'The faculty member  was successfully added to the Faculty table.';
    END IF;

END
$$

DELIMITER ;

CALL Fix_Egghead1();

大家好,

我正在创建一个事务回滚,在其中我创建了一个存储过程,该存储过程输出是否成功添加了教师成员或者未成功添加到教师表中,但问题是我的代码没有打印出来需要打印出来的错误消息。我知道这不是一次成功的交易,因为教师Eduardo Egghead仍然有学生注册记录。我怎么解决这个问题?但是,我确实提出了一个解决方案,解决方案是摆脱CONCAT函数,只需使用SELECT语句写入错误消息,就像我为提交部分所做的那样。还有其他建议吗?

1 个答案:

答案 0 :(得分:0)

从评论中移出:

我猜测如果问题不是未转义的引用,那么CONCAT()正在尝试连接NULL。如果NULL的任何输入为NULL,则CONCAT的行为将返回SELECT CONCAT_WS(' ', "The faculty member wasn't succesfully added to the Faculty table:", errorMessage) AS Results; -- or -- SELECT CONCAT("The faculty member wasn't succesfully added to the Faculty table: ", IFNULL(errorMessage,'NULL')) AS Results; 。我建议您使用CONCAT_WS()或将变量包装在IFNULL()

var sqlite3 = require('sqlite3').verbose();
var path = require('path')
var db = new sqlite3.Database(path.join(__dirname, '..', '/../','db', 'database.db'));