【问题标题】:mySQL stored procedure to insert row into table always inserts 0 values for all columns将行插入表的 mySQL 存储过程始终为所有列插入 0 值
【发布时间】:2015-12-14 15:20:22
【问题描述】:

我正在尝试在 mySQL 上执行插入存储过程作为一个小测试。 最终结果将所有零插入一行,而不是传递给定义器的值。

我的代码:

CREATE PROCEDURE `Test` (
IN IDvar int,
IN FirstNamevar nvarchar(50),
IN LastNamevar nvarchar(50),
IN Nationalityvar nvarchar(50),
In Agevar nvarchar(50),
)

BEGIN

INSERT INTO testtable (
ID,
FirstName,
LastName,
Nationality,
Age)

VALUES(
IDvar,
FirstNamevar,
LastNamevar,
Nationalityvar,
Agevar);

END

我点击应用,得到如下代码来构造存储过程

USE `testdb`;
DROP procedure IF EXISTS `Test`;

DELIMITER $$
USE `testdb` $$
CREATE PROCEDURE `Test` (
IN IDvar int,
IN FirstNamevar nvarchar(50),
IN LastNamevar nvarchar(50),
IN Nationalityvar nvarchar(50),
In Agevar nvarchar(50),
)

BEGIN

INSERT INTO testtable (
ID,
FirstName,
LastName,
Nationality,
Age)

VALUES(
IDvar,
FirstNamevar,
LastNamevar,
Nationalityvar,
Agevar);

END$$

DELIMITER;

如果我查看构造的存储过程代码,我会得到以下信息

CREATE DEFINER=`root`@localhost` PROCEDURE `Test`(
IN IDvar int,
IN FirstNamevar nvarchar(50),
IN LastNamevar nvarchar(50),
IN Nationalityvar nvarchar(50),
In Agevar nvarchar(50),
)

BEGIN

INSERT INTO testtable (
ID,
FirstName,
LastName,
Nationality,
Age)

VALUES(
IDvar,
FirstNamevar,
LastNamevar,
Nationalityvar,
Agevar);

END

当我使用值执行这个存储过程时:

IDvar = 3
FirstNamevar = TestFirstName
LastNamevar = TestLastName
Nationalityvar = GER
Age = 20

我知道了

set @IDvar = 0;
set @FirstNamevar = '0';
set @LastNamevar = '0';
set @Nationalityvar = '0';
set @Agevar = '0';
call testdb.Test(@IDvar, @FirstNamevar, @LastNamevar, @Nationalityvar, @Agevar);
select @IDvar, @FirstNamevar, @LastNamevar, @Nationalityvar, @Agevar;

显然,这以一个全为零的行结束。有人知道为什么会这样吗?

干杯

【问题讨论】:

  • 在 Agevar nvarchar(50),) 中发现了一个拼写错误,末尾有逗号。请注意,这不在 mySQL 的代码中,这是我在此处输入时的错误

标签: mysql stored-procedures parameters insert


【解决方案1】:

1) 您将全零传递给存储过程。这就是然后插入到表中的内容。

2) 您最后的 SELECT 不会从您在存储过程中插入的表中读取,而只是返回变量的值 - 所有这些都是 0。

所以一切都按照您的代码运行。

【讨论】:

  • 我意识到这一点,但是当我执行存储过程并将这些值传递给定义器时,例如IDvar = 3, FirstNamevar = TestFirstName, LastNamevar = TestLastName, Nationality = ENG, Age = 20, 它最终通过全零
  • 你是如何执行存储过程的?您的调用代码是什么,或者您是通过 GUI 执行的?
  • 使用 mySQL Workbench,找到我的存储过程并单击它旁边的闪电。然后我将值输入到定义器中并单击执行按钮
  • 如果您手动调用它会发生什么 - 即 CALL Test(3, 'TestFirstName', 'TestLastName', 'ENG', '20');
  • 这确实有效,并且插入了行,似乎不喜欢我通过定义器这样做
猜你喜欢
  • 2018-04-13
  • 1970-01-01
  • 1970-01-01
  • 2016-05-12
  • 2014-03-06
  • 2013-07-03
  • 1970-01-01
  • 1970-01-01
  • 2020-07-15
相关资源
最近更新 更多