【问题标题】:mysql stored procedure print error message and rollbackmysql存储过程打印错误信息并回滚
【发布时间】:2014-12-07 21:39:36
【问题描述】:

我正在尝试编写一个存储过程,它将首先打印错误消息然后回滚

我试过了,但是这个不起作用

我可以回滚它,但如果出现错误,它不会打印错误消息

DELIMITER 

CREATE PROCEDURE transaction_sp ()

BEGIN

DECLARE exit handler for sqlexception
BEGIN
-- ERROR
-------------------------------------------------------------------------------------- 
select "error message '%s' and errorno '%d'"------- this part in not working
-------------------------------------------------------------------------------------- 
ROLLBACK;
END;

DECLARE exit handler for sqlwarning
BEGIN
-- WARNING
-------------------------------------------------------------------------------------- 
 select "warning message '%s' and errorno '%d'"------- this part in not working
-------------------------------------------------------------------------------------- 
ROLLBACK;
END;

START TRANSACTION;
-- ADD option 5
INSERT INTO product_option(product_id,option_id,required) VALUES(insertedProductID,5,0);
SET poid = (SELECT LAST_INSERT_ID());
INSERT INTO     product_option_value(product_option_id,product_id,option_id,option_value_id,quantity,subtract,price,pr ice_prefix,points,points_prefix,weight,weight_prefix)    VALUES(poid,insertedProductID,5,50,0,0,4.99,'+',0,'+',0,'+');

-- ADD option 12
INSERT INTO product_option(product_id,option_id,required) VALUES(insertedProductID,12,1);

-- ADD option 13
INSERT INTO product_option(product_id,option_id,required)       VALUES(insertedProductID,13,0);

COMMIT;
END
$$

那么我怎样才能用这个存储过程来实现它

【问题讨论】:

    标签: mysql stored-procedures


    【解决方案1】:

    这对我有用

    DELIMITER 
    
    CREATE PROCEDURE transaction_sp ()
    
    BEGIN
    
    DECLARE exit handler for sqlexception
    BEGIN
    -- ERROR
    -------------------------------------------------------------------------------------- 
    --select "error message '%s' and errorno '%d'"------- this part in not working
    -------------------------------------------------------------------------------------- 
    GET DIAGNOSTICS CONDITION 1
    @p1 = RETURNED_SQLSTATE, @p2 = MESSAGE_TEXT;
    SELECT @p1 as RETURNED_SQLSTATE  , @p2 as MESSAGE_TEXT;
    ROLLBACK;
    END;
    
    DECLARE exit handler for sqlwarning
    BEGIN
    -- WARNING
    -------------------------------------------------------------------------------------- 
    -- select "warning message '%s' and errorno '%d'"------- this part in not working
    -------------------------------------------------------------------------------------- 
    GET DIAGNOSTICS CONDITION 1
    @p1 = RETURNED_SQLSTATE, @p2 = MESSAGE_TEXT;
    SELECT @p1 as RETURNED_SQLSTATE  , @p2 as MESSAGE_TEXT;
    ROLLBACK;
    END;
    
    START TRANSACTION;
    -- ADD option 5
    INSERT INTO product_option(product_id,option_id,required) VALUES(insertedProductID,5,0);
    SET poid = (SELECT LAST_INSERT_ID());
    INSERT INTO     product_option_value(product_option_id,product_id,option_id,option_value_id,quantity,subtract,price,pr ice_prefix,points,points_prefix,weight,weight_prefix)    VALUES(poid,insertedProductID,5,50,0,0,4.99,'+',0,'+',0,'+');
    
    -- ADD option 12
    INSERT INTO product_option(product_id,option_id,required) VALUES(insertedProductID,12,1);
    
    -- ADD option 13
    INSERT INTO product_option(product_id,option_id,required)       VALUES(insertedProductID,13,0);
    
    COMMIT;
    END
    $$
    

    【讨论】:

    • 兄弟,这不是mysql
    • 我试了一个mysql存储过程,可以说是mysql代码,运行正常!
    • GET DIAGNOSTICS 在 5.6.4 中可用
    【解决方案2】:

    抱歉,我可能迟到了,但在您的询问中

    BEGIN
    -- ERROR
    -------------------------------------------------------------------------------------- 
    select "error message '%s' and errorno '%d'"------- this part in not working
    -------------------------------------------------------------------------------------- 
    ROLLBACK;
    END;
    

    改成

    BEGIN
    select "error message '%s' and errorno '%d'"; -- use missed the semicolon
    ROLLBACK;
    END;
    

    因此它实际上会显示列名为“ROLLBACK”的错误消息,而不是打印和回滚事务。

    【讨论】:

      【解决方案3】:

      这是我打印错误消息和回滚的方式:

      CREATE PROCEDURE procedure_name() 
      BEGIN
          DECLARE EXIT HANDLER FOR SQLEXCEPTION
          BEGIN
              SHOW ERRORS;  --this is the only one which you need
              ROLLBACK;   
          END; 
          START TRANSACTION;
              --query 1
              --query 2
              --query 3
          COMMIT;
      END 
      

      如果查询 1、2 或 3 将抛出错误,HANDLER 将捕获 SQLEXCEPTION 和 SHOW ERRORS 将为我们显示错误。注意:SHOW ERRORS 应该是 HANDLER 中的第一条语句。

      【讨论】:

      • 这适用于比 5.6.4 更早的版本,从 5.6.4 GET DIAGNOSTICS 可用。
      【解决方案4】:

      某些版本的 MySQL 将 MESSAGE_TEXT 常量视为导致错误显示的列。这种方式非常适合我在 MySQL 8x 社区中的工作。

      DECLARE EXIT HANDLER FOR SQLEXCEPTION
      BEGIN
          GET DIAGNOSTICS CONDITION 1 @ERRNO = MYSQL_ERRNO, @MESSAGE_TEXT = MESSAGE_TEXT;
          SELECT 'ERROR' AS STATUS, CONCAT('MySQL ERROR: ', @ERRNO, ': ', @MESSAGE_TEXT) AS MESSAGE;
          ROLLBACK;
      END;
      

      【讨论】:

        【解决方案5】:

        我简化了过程错误处理。

        CREATE  PROCEDURE PROCNAME (
         IN  `ID` INT(11),
         OUT `MESSAGE` VARCHAR(500), 
         OUT `Q_STATUS` BOOLEAN)
        BEGIN
         -- Error handling start here
         DECLARE EXIT HANDLER FOR SQLEXCEPTION
         BEGIN
            GET DIAGNOSTICS CONDITION 1 @ERRNO = MYSQL_ERRNO, @MESSAGE_TEXT = MESSAGE_TEXT;
            SET MESSAGE = CONCAT(@MESSAGE_TEXT," : Erro code - ",@ERRNO);
            SET Q_STATUS= 0;
            ROLLBACK; -- if any error occures it will rollback changes
         END;
         -- main query start here
         START TRANSACTION;
         SELECT IAM,ID; -- THIS WILL CAUSE OF ERROR 'UNKNOWN COLUMN IAM'
         SET Q_STATUS = 1; -- IF NO ERROR QUERY STATUS WILL GIVE YOU 1
         COMMIT; -- it is necessary in transaction 
        
        END;
        

        您也可以将此过程用作模板

        您可以将错误代码与自定义错误消息分开,以便进一步处理错误。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-10-15
          • 2020-05-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-12-22
          相关资源
          最近更新 更多