gpt4 book ai didi

MySQL游标只返回一条记录

转载 作者:行者123 更新时间:2023-11-29 02:26:53 26 4
gpt4 key购买 nike

我使用 Hostgator 来托管我的 PHP 网站以及 MySQL 5.5.33 和 PHPMyAdmin 3.5.5。我想使用游标从表中的单个记录中获取值。以下是该存储过程的代码:

CREATE DEFINER=`lnutri`@`localhost` PROCEDURE `TestCursor`()
NO SQL
BEGIN
DECLARE done INT DEFAULT FALSE;
DECLARE cGroupID INT;
DECLARE cGroupName VARCHAR(50);
DECLARE cursor1 CURSOR FOR SELECT GroupID, GroupName FROM Groups;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

OPEN cursor1;

read_loop: LOOP
FETCH cursor1 INTO cGroupID,cGroupName;
IF done THEN
LEAVE read_loop;
END IF;
SELECT cGroupID AS GroupID, cGroupName as GroupName;

END LOOP;

CLOSE cursor1;
END

但是存储过程似乎只返回第一条记录:

GroupID GroupName
1 Default Group

这是组表的结构

CREATE TABLE IF NOT EXISTS `Groups` (
`GroupID` int(11) NOT NULL AUTO_INCREMENT,
`GroupName` varchar(50) COLLATE utf8_unicode_ci NOT NULL,
`Description` varchar(500) COLLATE utf8_unicode_ci NOT NULL,
`DateCreated` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`GroupID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=39 ;

这是组表的数据:

GroupID GroupName   Description DateCreated
1 Default Group 0000-00-00 00:00:00
2 Group 2 0000-00-00 00:00:00
29 Regis 0000-00-00 00:00:00
31 Benetas 0000-00-00 00:00:00
32 Domain 0000-00-00 00:00:00
36 none 0000-00-00 00:00:00
37 Aevum 2013-11-11 17:40:56
38 Uniting Aged Care 2013-11-15 07:26:19

最佳答案

您的问题是存储过程返回与表中的行一样多的结果集,而每个结果集只有一行。您的客户端恰好是 phpmyAdmin,不处理多个结果集。这就是为什么您只看到一行的原因。

要检查您的光标是否正常工作,您需要做的就是临时创建表(我们称它为log),然后更改

SELECT cGroupID AS GroupID, cGroupName as GroupName;

INSERT INTO log(group_id, group_name)
SELECT cGroupID AS GroupID, cGroupName as GroupName;

并且您会看到,在调用您的过程之后,您将在 log 表中拥有所有记录。

这是 SQLFiddle 演示


现在做你刚刚做的事情是绝对不切实际的。如果您真的需要逐行进行一些处理并返回一些结果

  1. 创建一个临时表
  2. 在您遍历光标时在其中插入所需的结果
  3. 使用 select 将临时表中的结果返回给客户端
  4. 删除临时表

为了说明这一点,假设您希望您的过程仅每隔一行返回一次。那么你的程序可能看起来像这样

DELIMITER $$
CREATE PROCEDURE `TestCursor`()
BEGIN
DECLARE done, counter INT DEFAULT FALSE;
DECLARE cGroupID INT;
DECLARE cGroupName VARCHAR(50);
DECLARE cursor1 CURSOR FOR SELECT GroupID, GroupName FROM Groups;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

CREATE TEMPORARY TABLE log
(
id int not null auto_increment primary key,
group_id int,
group_name varchar(50)
);

OPEN cursor1;

read_loop: LOOP
FETCH cursor1 INTO cGroupID,cGroupName;
SET counter = counter + 1;
IF done THEN
LEAVE read_loop;
END IF;
IF counter % 2 <> 0 THEN
INSERT INTO log(group_id, group_name)
SELECT cGroupID AS GroupID, cGroupName as GroupName;
END IF;
END LOOP;

CLOSE cursor1;

SELECT * FROM log;
DROP TABLE log;
END

DELIMITER ;

这是 SQLFiddle

关于MySQL游标只返回一条记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20038557/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com