mysql - 从存储过程中的整数中减去整数(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 |
为了得到我想要的结果,我的代码应该做些什么改变?
解决方案
在
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
......
推荐阅读
- c++ - C++:std::runtime_error 对象会在 longjmp 中泄漏吗?
- java - AAPT:错误:未找到样式属性“android:attr/windowSplashScreenBackground”
- firebase - 在一种方法中过滤firebase调用,按命名参数过滤不起作用->变量类型错误?
- python - 循环区域中python中的连接字符串
- prometheus - Prometheus & grafana:传说中的错误总数
- python - 控制流 - 跳转到另一个循环?
- python - S3 boto3 拒绝覆盖端点 URL
- merge - Azure 数据工厂合并 2 个具有不同架构的 csv 文件
- solr - Solr 导出/复制到数据库
- ejs - 从 Single-SPA 中的单独 JSON 文件加载所有导入映射?