SELECT INTO 在 MySQL 触发器中返回 NULL

问题描述 投票:0回答:1

我遇到一个问题,MySQL 触发器中的 SELECT INTO 查询对于应正确获取的值返回 NULL。

这是我的触发代码:

BEGIN
    DECLARE program_price DECIMAL(10, 2);
    DECLARE payment_type enum('Full', 'Installment');
    DECLARE program_duration_months INT;
    DECLARE amount DECIMAL(10, 2);
    DECLARE details VARCHAR(255);
    DECLARE payment_due DATE;

 -- Log start of trigger execution
    INSERT INTO debug_table (debug_message) VALUES ('Trigger execution started.');
    -- Fetch program details
    INSERT INTO debug_table (debug_message)
    VALUES (CONCAT('Fetching program details for program_code: ', NEW.program_code));

    SELECT price, payment_type
    INTO program_price, payment_type
    FROM Programs
    WHERE program_code = NEW.program_code;
    
       INSERT INTO debug_table (debug_message)
    VALUES (CONCAT('Fetched program details for program_code: ', NEW.program_code));

    -- Log fetched values
    INSERT INTO debug_table (debug_message)
    VALUES (CONCAT('Fetched values - program_price: ', program_price, ', payment_type: ', payment_type, ', program_duration_months: ', program_duration_months));
    INSERT INTO debug_table (debug_message) VALUES ('Trigger execution completed.');
    

END

触发器执行成功,但当运行 SELECT INTO 时,program_price、 payment_type 和program_duration_months 的值始终返回为 NULL。我检查了Programs表中的program_code,它存在,并且值的大小写敏感度没有问题(我已经测试过这一点)。

我尝试过的事情:

  • 检查了程序表中的program_code值(本例中为D632),它匹配。
  • 确保不存在区分大小写的问题(排序规则不是 utf8_bin)。
  • 添加了调试语句来记录 SELECT INTO 输出。
  • 尝试使用不带 INTO 子句的 SELECT 查询,并确认直接执行时(不在触发器中)正确返回值。

“程序”表具有以下预期数据:

program_price = 499.99
payment_type = 'Installment'

mysql database triggers mysql-5.7 select-into
1个回答
0
投票

您的触发器有两个问题。

首先,

program_duration_months
局部变量没有被赋予任何值,也没有默认值。所以默认为NULL。如果任何参数为 NULL,则
CONCAT()
返回 NULL。

其次,您将

payment_type
变量命名为与表的列相同。所以它是不明确的,MySQL 不知道你指的是哪个
payment_type
。因此,对
payment_type
的引用是列,而不是变量。

要解决后一个问题,请将局部变量命名为与该表中的列名称不同的名称。

例如,我用这些更改测试了触发器:

BEGIN
    ...
    DECLARE v_payment_type enum('Full', 'Installment'); -- change variable name
    DECLARE program_duration_months INT DEFAULT 0; -- give variable a default value

    ...

    SELECT price, payment_type
    INTO program_price, v_payment_type
    FROM Programs
    WHERE program_code = NEW.program_code;

    ...

    INSERT INTO debug_table (debug_message)
    VALUES (CONCAT('Fetched values - program_price: ', program_price,
      ', payment_type: ', v_payment_type, 
      ', program_duration_months: ', program_duration_months));

    ...
END
© www.soinside.com 2019 - 2024. All rights reserved.