【问题标题】:Can not understand why the error is无法理解为什么会出现错误
【发布时间】:2014-05-18 06:10:17
【问题描述】:

我收到错误代码:1327。

Undeclared variable; order_id.

我看了好几个小时的代码,不知道哪里出错了。我认为它可能链接到Select last insert()..

USE Data_Name

DROP PROCEDURE IF EXISTS test;

DELIMITER //

PROCEDURE test()
BEGIN
    DECLARE sql_error INT DEFAULT FALSE;

DECLARE CONTINUE HANDLER FOR SQLEXCEPTION
    SET sql_error = TRUE;

START TRANSACTION;

INSERT INTO orders VALUES
    (DEFAULT, 3, NOW(), '10.00', '0.00', NULL, 4,
    'American Express', '378282246310005', '04/2013', 4);

SELECT LAST_INSERT_ID()INTO order_id;

INSERT INTO order_items VALUES
    (DEFAULT, order_id, 6, '415.00', '161.85', 1);

INSERT INTO order_items VALUES
    (DEFAULT, order_id, 1, '699.00', '209.70', 1);

IF sql_error = FALSE THEN
    COMMIT;
SELECT 'The transaction was committed.';
ELSE
    ROLLBACK;
SELECT 'The transaction was rolled back.';
END IF;
END//

【问题讨论】:

  • 我要说的很明显:order_id 没有定义。

标签: mysql mysql-workbench


【解决方案1】:

你需要在你的过程中添加一行来声明变量:

DECLARE order_id BIGINT UNSIGNED;

我选择类型为BIGINT UNSIGNED,因为这是LAST_INSERT_ID()根据documentation返回的类型。

此外,请务必将该变量命名为与 order_items 表中的任何列名不同的名称,否则 INSERT 语句中对该变量的引用将不知道您是否打算使用该变量,或表格的列。

【讨论】:

    【解决方案2】:

    你必须替换

     DECLARE sql_error INT DEFAULT FALSE;...
    
     DECLARE CONTINUE HANDLER FOR SQLEXCEPTION
         SET sql_error = TRUE;...
    
     IF sql_error = FALSE THEN....
    

     DECLARE order_id BIGINT UNSIGNED;...
    
     DECLARE CONTINUE HANDLER FOR SQLEXCEPTION
       SET order_id = TRUE;...
    
     IF order_id = FALSE THEN...
    

    接下来,关注 INSERT 语句并更改为 order_items1 和 order_items2。

    示例:

     INSERT INTO order_items1 VALUES
         (DEFAULT, order_id, 6, '415.00', '161.85', 1);
    
     INSERT INTO order_items2 VALUES
         (DEFAULT, order_id, 1, '699.00', '209.70', 1);
    

    【讨论】:

      猜你喜欢
      • 2022-06-19
      • 2018-08-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-25
      • 2021-12-27
      • 1970-01-01
      相关资源
      最近更新 更多