我在 MySQL 数据库中发现了两个非常奇怪的问题。
我的 MySQL 数据库版本是5.6。
问题1:
我有更新列值的简单存储过程:
存储过程如下:
drop PROCEDURE if exists mysql_TestProc;
CREATE PROCEDURE mysql_TestProc(Finaltable VARCHAR(1024),ColTOProcess VARCHAR(1024)
,strFind TEXT,strReplace TEXT)
Label1:BEGIN
DECLARE code VARCHAR(1024) DEFAULT '00000' ;
-- Exception Handler
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION
BEGIN
GET DIAGNOSTICS CONDITION 1
code = RETURNED_SQLSTATE;
END;
-- generate dynamic Query
SET @s:=CONCAT('UPDATE ',FinalTable,' SET
',ColTOProcess,'=REPLACE(',ColTOProcess,',\'',strFind,'\',\'',strReplace ,'\');');
PREPARE stmt from @s;
EXECUTE stmt;
-- If any exeption during query execution then Exception Handler will
-- assign error code to "code" variable
-- else "code" variable will have default value.
IF code != '00000' THEN
-- Error found..
select code ;
LEAVE Label1;
END IF;
END;
call mysql_TestProc("AnyTableName","ColumnName","Find Value","Replace Value").
如果您使用适当的参数调用上述存储过程,它将成功更新值。
但在我的数据库中,它成功更新了错误代码“ 42S22 ”的值。
我换了机器,然后一切正常。
所以这种奇怪的行为只适用于我的机器和我的数据库(“_temp”)。
问题2:
我有如下简单的程序:
DROP PROCEDURE IF EXISTS mysql_PrepareLogTable;
CREATE PROCEDURE mysql_PrepareLogTable(LogTable VARCHAR(1024),code TEXT,comment TEXT,category VARCHAR(1024),timestamp DATETIME,duration VARCHAR(100),rows INT,msg TEXT)
BEGIN
SET code=CONCAT(comment,' \n ',code);
SET @tempprepare=CONCAT('INSERT INTO ',LogTable,' VALUES ("',code,'","',category,'","',timestamp,'","',duration,'",',rows,',','"',msg,'")');
PREPARE stmt from @tempprepare;
EXECUTE stmt;
END;
我可以编译上面的存储过程脚本,除了一个数据库(“test2”)之外的所有mysql数据库。只有在数据库“test2”中,我无法编译上面的存储过程脚本。即使我删除了存储过程,然后尝试执行脚本,但仍然无法在数据库“test2”中编译脚本。
我正在使用 Toad 6 和 mysql workbench 6.0。
因此,任何人都对这两个问题有任何想法。
谢谢你,罗纳克