昨天我注意到了一个非常有趣的(也是意想不到的)事情。我得到了一个任务(在生产环境中),通过获取dummytable中的所有值来更新TableA的三列(由于某些显而易见的原因,我正在更改表和列的名称)。这两个表的主键都是A列。我知道这个任务非常简单,可以通过多种方式完成,但我选择编写一个存储过程(如下所示)。MySql过程产生错误结果
当存储过程完成执行时,注意到列B,C & statusCode具有相同的值(即,成千上万条记录在这三列中具有相同的值)。有人能告诉我哪里出了问题吗?
1)这个存储过程有什么问题(或缺失)? (Dummy table也有成千上万的记录) 2)除了创建存储过程之外,完成此任务的最佳方式是什么?
PS:我在使用MySQL工作台的生产环境中创建(执行了这个存储过程),并且在过程的执行过程中出现了一个异常:“与MySQL服务器失去连接”,但我猜想自从我运行在远程计算机上执行此过程时,在执行过程时服务器上没有中断。
这是我的存储过程。
DELIMITER $$
CREATE DEFINER=`ABC`@`%` PROCEDURE `RetrieveExtractionData`()
BEGIN
DECLARE claimlisttraversed BOOLEAN DEFAULT FALSE;
DECLARE a VARCHAR(20);
DECLARE b INTEGER;
DECLARE c INTEGER;
DECLARE claimlist CURSOR FOR SELECT
`dummytable`.`A`,
`dummytable`.`B`,
`dummytable`.`C`
FROM `ABC`.`dummytable`;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET claimlisttraversed = TRUE;
OPEN claimlist;
claimlistloop: LOOP
FETCH claimlist INTO a, b, c;
IF claimlisttraversed THEN
CLOSE claimlist;
LEAVE claimlistloop;
END IF;
UPDATE `ABC`.`TableA`
SET
`B` = b,
`C` = c,
`statuscode` = 'Sent'
WHERE `A` = a;
END LOOP claimlistloop;
END
感谢您的回复,但您能否解释为什么在这个特殊情况下光标会变慢? –
不仅在这个特殊的例子中,它们总是**缓慢。解释为什么会过深入源代码。但光标首先会读取整个虚拟表格并将其保存在内存中。然后逐行执行更新语句。而使用简单的更新语句读取两个表的部分内容,并将一些指向内存地址的指针交换并写回到磁盘。非常快。 – fancyPants