当我调用一个应该调用我知道存在的数据的过程时,我总是得到零
I keep getting zeros when I call a procedure that should be calling data I know exists
我正在尝试在 MySQL 中编写一个存储过程然后将其回调,我必须提交返回正确响应的过程的屏幕截图。存储过程的代码似乎工作正常(至少没有错误),但是当我 运行 CALL 函数时它 returns 0.00 无论我为 @column3 输入哪个数字。我的导师认为问题是在我在最顶部定义变量之前将 OUT 声明为 AmountDue,但我想不出另一种方法来在没有 IN/OUT 约束的情况下在 CALL 函数中输入 @column3。显然,我对此很陌生,所以如果我遗漏了一些明显的东西,请原谅我...有人有任何想法吗?
此外,我在构建数据库、添加 table 等方面不需要任何帮助。数据库存在并正常运行。只需要存储过程和回调它的帮助。谢谢
delimiter //
DROP PROCEDURE IF EXISTS GetAmountDue;
CREATE PROCEDURE GetAmountDue(IN order_num INT, OUT AmountDue DECIMAL(10,2))
BEGIN
DECLARE AmountDue DECIMAL(10,2) DEFAULT 0;
SELECT COST
INTO @AmountDue
FROM cake_shape
INNER JOIN ll_cakery.order
ON cake_shape.shape_id=order.shape_id
WHERE order_num=@order_num;
SELECT AmountDue;
END//
delimiter ;
CALL GetAmountDue('113',@AmountDue);
- order_num 是一个包含 3 个字符整数数据值的列
- cost 是一个具有独立 decimal(10,2) 数据值的列
- cake_shape 是一个 table
- ll_cakery.order 是 table(这不太正确,因为
mysql 有一个命令 ORDER 所以我必须给出模式名称)
- shape_id是一个列,只在join
的程序中使用
- 在CALL函数中,@order_num=113
你传递的是字符串而不是整数
您没有将第 3 列与第 1 列进行比较
最后,您必须使用从 select
获得的数据设置输出变量
最后永远不要像列名那样命名变量,这只会带来问题
CREATE tABLE table1 ( COST DECIMAL(19,2),column2 int, column3 int)
INSERT INTO table1 VALUES (10.2,1,1),(10.2,1,1)
CREATE TABLE table2 (column2 int)
INSERT INTO table2 VALUES (1)
CREATE PROCEDURE GetAmountDue(IN _column1 INT, OUT _AmountDue DECIMAL(10,2))
BEGIN
SELECT SUM(COST)
INTO @AmountDue
FROM table1
INNER JOIN table2
ON table1.column2=table2.column2
WHERE column3=_column1;
SET _AmountDue := @AmountDue;
END
CALL GetAmountDue(1,@AmountDue);
SELECT @AmountDue
| @AmountDue |
| ---------: |
| 20.40 |
db<>fiddle here
我正在尝试在 MySQL 中编写一个存储过程然后将其回调,我必须提交返回正确响应的过程的屏幕截图。存储过程的代码似乎工作正常(至少没有错误),但是当我 运行 CALL 函数时它 returns 0.00 无论我为 @column3 输入哪个数字。我的导师认为问题是在我在最顶部定义变量之前将 OUT 声明为 AmountDue,但我想不出另一种方法来在没有 IN/OUT 约束的情况下在 CALL 函数中输入 @column3。显然,我对此很陌生,所以如果我遗漏了一些明显的东西,请原谅我...有人有任何想法吗?
此外,我在构建数据库、添加 table 等方面不需要任何帮助。数据库存在并正常运行。只需要存储过程和回调它的帮助。谢谢
delimiter //
DROP PROCEDURE IF EXISTS GetAmountDue;
CREATE PROCEDURE GetAmountDue(IN order_num INT, OUT AmountDue DECIMAL(10,2))
BEGIN
DECLARE AmountDue DECIMAL(10,2) DEFAULT 0;
SELECT COST
INTO @AmountDue
FROM cake_shape
INNER JOIN ll_cakery.order
ON cake_shape.shape_id=order.shape_id
WHERE order_num=@order_num;
SELECT AmountDue;
END//
delimiter ;
CALL GetAmountDue('113',@AmountDue);
- order_num 是一个包含 3 个字符整数数据值的列
- cost 是一个具有独立 decimal(10,2) 数据值的列
- cake_shape 是一个 table
- ll_cakery.order 是 table(这不太正确,因为 mysql 有一个命令 ORDER 所以我必须给出模式名称)
- shape_id是一个列,只在join 的程序中使用
- 在CALL函数中,@order_num=113
你传递的是字符串而不是整数
您没有将第 3 列与第 1 列进行比较
最后,您必须使用从 select
获得的数据设置输出变量最后永远不要像列名那样命名变量,这只会带来问题
CREATE tABLE table1 ( COST DECIMAL(19,2),column2 int, column3 int)
INSERT INTO table1 VALUES (10.2,1,1),(10.2,1,1)
CREATE TABLE table2 (column2 int)
INSERT INTO table2 VALUES (1)
CREATE PROCEDURE GetAmountDue(IN _column1 INT, OUT _AmountDue DECIMAL(10,2)) BEGIN SELECT SUM(COST) INTO @AmountDue FROM table1 INNER JOIN table2 ON table1.column2=table2.column2 WHERE column3=_column1; SET _AmountDue := @AmountDue; END
CALL GetAmountDue(1,@AmountDue);
SELECT @AmountDue
| @AmountDue | | ---------: | | 20.40 |
db<>fiddle here