【问题标题】:Error handling in stored procedure when calling with wrong parameters使用错误参数调用时存储过程中的错误处理
【发布时间】:2022-01-04 13:44:01
【问题描述】:

我正在尝试处理我的第一个书面存储过程中的故障。我的目标是有一个默认设置为零的变量,如果发生任何故障,它将增加到 1。此后,我将检查这个变量是否设置为 1 并输出一个简单的文本。

这是我到目前为止所得到的,但如果我尝试使用 2 个 varchars 而不是 Integer 调用该过程,我不会收到我的消息。

任何提示我做错了什么?

DROP PROCEDURE IF EXISTS changePrice;

DELIMITER $$

CREATE PROCEDURE 
    changePrice(IN categorie VARCHAR(30), IN factor INT) 
BEGIN
    DECLARE stat_var INT DEFAULT 0;
   
    BEGIN         
        DECLARE EXIT HANDLER FOR SQLEXCEPTION
        BEGIN
            SET stat_var = 1;
        END;
        
        UPDATE 
            Artikel
        SET
            Einzelpreis = (Einzelpreis * (factor / 100))
        WHERE
            Kategorie = categorie;
    END;
    
    IF stat_var = 1 THEN
        SELECT 'Fehler MOOOOOOOP';
    END IF;
END $$

DELIMITER ;

CALL changePrice('Metallwaren', 'a');

【问题讨论】:

  • 我希望“不正确的整数值:'a' for column 'factor' at row ..”引用CALL changePrice('Metallwaren', 'a'); 行。
  • 但是你看到的错误(“ERROR 1366 (HY000): Incorrect integer value: 'a' for column 'factor' at row 1”)被更早地发现了。

标签: mysql sql stored-procedures


【解决方案1】:
  1. EXIT HANDLER 是为嵌套的 BEGIN-END 块定义的,因此当 SQLEXCEPTION 发生时,代码流将从该块中退出,而不是从整个过程中退出。
  2. 局部变量只定义在 BEGIN-END 块中,在 SP 执行完成后将被销毁。您必须使用特定于连接且不会被破坏的用户定义变量。
  3. 您为定义为 INT 的参数提供字符串类型的值。这将在参数类型检查期间导致错误。 SP 不应执行,处理程序代码不应触发。

【讨论】:

  • 嗯,好的。我现在尝试使用正确的类型调用该过程,例如 ´´´changePrice('Metallwaren', 'a');''' 并将行名 'Einzelpreis' 更改为不存在的行名并且它起作用了,消息被触发.
猜你喜欢
  • 2015-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-17
  • 2011-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多