首页 > 解决方案 > 从存储过程中的整数中减去整数(SQL 版本 8.0.23)

问题描述

我想从存储过程中的整数中减少一个整数,但我没有得到我想要的结果。

我有以下表格:

表 h(

我 int
c int )

持有价值观

一世 C
1 100

表 k(

j int
c int
d text
e 时间戳)

持有价值观

j C d e
1 100 无效的 无效的

我编写了以下代码:

DROP PROCEDURE IF EXISTS a;

DELIMITER //

CREATE PROCEDURE a(b int, c int, d text, e timestamp)
BEGIN
DECLARE f INT;
SELECT c INTO @f FROM h WHERE i = j;
START TRANSACTION;
CASE WHEN (@f - c) < 0
THEN SIGNAL SQLSTATE "45000"
SET MESSAGE_TEXT = "@f - c < 0 is not allowed";
WHEN c < 0
THEN SIGNAL SQLSTATE "45000"
SET MESSAGE_TEXT = "c < 0 is not allowed";
WHEN j NOT IN (select i from h)
THEN SIGNAL SQLSTATE "45000"
SET MESSAGE_TEXT = "j does not exist";
ELSE
UPDATE h AS l SET c = (@f - c) WHERE j = i;
INSERT INTO k (d) VALUE (d);
INSERT INTO k (e) value (e);        
END CASE;
COMMIT;
END //
DELIMITER ;

CALL a (1, 10, "changed -10", "2002-06-27 14:42:33");

SELECT * FROM h;

表 k 已正确更新。但表 h 不是。我想在上面的代码运行后得到表 h 的以下结果。

一世 C
1 90

但相反我得到

一世 C
1 0

为了得到我想要的结果,我的代码应该做些什么改变?

标签: mysqlsql

解决方案


SELECT c INTO @f FROM h WHERE i = j;

您选择一个变量(定义为 SP 参数),而不是列值!

在您的通话中,它变成

SELECT 10 INTO @f FROM h WHERE i = j; -- parameter variable `c` gets the value 10.

你必须使用

SELECT h.c INTO @f FROM h WHERE i = j;

让我重复一遍:

永远不要干涉列名和局部变量名(SP 参数也是局部变量)。


此外 - 您的 SP 将失败,因为它使用未声明的变量j。通过参数含义/分配的值,它必须是b......


推荐阅读