【问题标题】:MySQL user-defined variables losing value immediately?MySQL用户定义的变量立即失去价值?
【发布时间】:2011-07-07 19:11:58
【问题描述】:

所以我遇到了一个即将让我发疯的 MySQL 5.5 问题。我有一些嵌套的存储过程,其中一个将一些数据插入到表中,然后将LAST_INSERT_ID() 选择到出站参数中。以下是我的存储过程:

DELIMITER $$

CREATE DEFINER=`root`@`localhost` PROCEDURE `createNewSession`(
    in inputIP varchar(15),
    in inputPostTime bigint,
    in inputPostInterval bigint,
    in inputPlatform varchar(45),
    out outSessionID int)
BEGIN
    insert into myDB.session (IP, StartTime, LastPost, Platform) 
        values (inputIP, inputPostTime - inputPostInterval, inputPostTime, inputPlatform);

    select LAST_INSERT_ID() into outSessionID;
END;$$

现在,如果我传递正确的参数(即:我已经针对插入语句测试并且工作正常的参数)并调用以下命令,我将得到正确的 ID

CALL myDB.createNewSession('127.0.0.1', 1310062874228, 1310062894228, 'Platform', @outVar);
select LAST_INSERT_ID();

但是,如果我调用以下命令,则会返回一个带有 ? 值的 BLOB 参数。

CALL myDB.createNewSession('127.0.0.1', 1310062874228, 1310062894228, 'Platform', @outVar);
select @outVar;

为什么会发生这种情况?这个存储过程已经工作了一个月+,据我所知,数据库设置没有任何改变。从存储过程中选择出站参数时,为什么我会收到除LAST_INSERT_ID() 以外的任何内容?

任何帮助将不胜感激。快疯了……

编辑

我在调用顶级存储过程时遇到的错误如下:

Error Code: 1264. Out of range value adjusted for column 'outSessionID' at row 68

编辑 2

这是表结构

Field Type Null Key Extra
'SessionID', 'int(11)', 'NO', 'PRI', NULL, 'auto_increment'
'IP', 'varchar(15)', 'NO', '', NULL, ''
'StartTime', 'bigint(20)', 'NO', '', NULL, ''
'LastPost', 'bigint(20)', 'NO', '', NULL, ''
'Platform', 'varchar(45)', 'NO', '', NULL, ''

编辑 3

所以在搞砸了一些之后,我发现以下查询一起调用时也会选择一个值为“?”的 BLOB 参数

set @tempVar = 25;
select @tempVar;

这不应该返回 25 吗?

【问题讨论】:

  • 你在使用msql工作台吗?
  • 是的,我正在使用 MySQL 工作台。不管我从哪里点击数据库,都会发生错误。
  • 好的,只是出于好奇,它在数据查看器中的外观如何? (如果您右键单击该字段)
  • 是的,参数是相同的。这是为了表明问题在于将 LAST_INSERT_ID() 分配给出站参数不起作用。至于数据在数据查看器中的外观,单元格中有一个显示“BLOB”的框,当我将字段内容复制并粘贴时,我会收到一个“?”

标签: mysql stored-procedures parameters


【解决方案1】:

请尝试

SET outSessionID := LAST_INSERT_ID();

在 proc 中而不是执行 SELECT。

【讨论】:

  • 我已经或多或少地使用 SELECT INTO 语句执行此操作,但我刚刚测试了此方法,我再次收到带有 ? 的 BLOB 参数值而不是我正在寻找的 INT 值。
  • 是的,我知道,但是使用 SET 是 IMO 更直接的方法;也许它会有所帮助:) 好吧,虽然我认为这不会真正有帮助,但你能发布你的表定义吗?您是否尝试过使用其他(旧)版本?
  • 是的,这绝对是一种更直接的方式。我没有使用旧版本,但这个存储过程在 3 小时前运行良好。有没有办法可以查看服务器设置的更改日志或类似的内容?我在本地托管的数据库副本仍然可以正常工作。我还发布了上面的表定义
  • 这会返回什么:SELECT AUTO_INCREMENT FROM information_schema.TABLES WHERE TABLE_SCHEMA = 'myDB' AND TABLE_NAME = 'session'
  • 它返回 186。调用 LAST_INSERT_ID() 将返回正确的值,所以我认为它与 AUTO_INCREMENT 值无关。此外,如果我在存储过程中选择出站参数,则会返回正确的值,以便正确分配它。但是,如果我在 SP 调用之后选择了我传递给存储过程的参数,那么它会返回 blob 值,所以它一定与内存设置有关?
猜你喜欢
  • 1970-01-01
  • 2011-11-05
  • 1970-01-01
  • 2021-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-17
  • 1970-01-01
相关资源
最近更新 更多