无法理解错误的原因

时间:2014-04-05 23:07:15

标签: mysql mysql-workbench

我收到错误代码: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//

2 个答案:

答案 0 :(得分:0)

您需要在程序中使用一行来声明变量:

DECLARE order_id BIGINT UNSIGNED;

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

另外,请确保将该变量命名为与order_items表格中任何列名称不同的内容,否则INSERT语句中对该变量的引用不会知道是否你的意思是使用变量或表的列。

答案 1 :(得分:0)

您必须替换

 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);