mysql游标取不到值_mysql - MySQL游标获取不起作用 - 堆栈内存溢出

本文讨论了一个关于MySQL存储过程中的问题,该过程实现了Dijkstra的最短路径算法。作者遇到的问题是,在游标cur2遍历sampledata表时,无法正确地从游标中获取`pt_from`, `pt_to`和`pt_dist`的值,尽管数据存在且其他过程中此代码可以正常工作。作者寻求帮助以找出导致游标失效的原因。" 105743751,7405661,递归删除带头结点单链表中值为x的节点,"['算法', '数据结构', '链表']
摘要由CSDN通过智能技术生成

我有以下存储过程,用于实现Dijkstra的最短路径算法:

CREATE PROCEDURE `Dijkstras`(IN `pids` VARCHAR(512), IN `startP` VARCHAR(8), IN `endP` VARCHAR(8), OUT `dist` DECIMAL(20,10), OUT `eset` VARCHAR(1024))

BEGIN

DECLARE currentP VARCHAR(4);

DECLARE finished INT DEFAULT 0;

DECLARE pt_from, pt_to int;

DECLARE pt_dist decimal(20,10);

DECLARE done INT DEFAULT 0;

DECLARE cur2 CURSOR FOR

select F.id as `from`, T.id as `to`, dist(F.lat, F.lng, T.lat, T.lng)

as dist

from sampledata F, sampledata T

where F.id < T.id and

find_in_set(convert(F.id, char(10)), pids) and

find_in_set(convert(T.id, char(10)), pids)

order by dist;

DECLARE CONTINUE HANDLER FOR not found SET done = 1;

SET currentP= startP;

SET eset = '';

SET dist = 0;

SET done=0;

OPEN cur2; -- this finds pariwise distances in miles.

REPEAT

FETCH cur2 INTO pt_from, pt_to, pt_dist;

SET dist= dist+pt_dist;

SET eset= CONCAT(eset, ',');

IF(currentP=pt_from OR currentP=pt_to) AND

(IN_SET(pt_from,pids) AND IN_SET(pt_to,pids)) THEN

BEGIN

SET dist= dist+ pt_dist;

SET pids= REMOVE_MEMBER(currentP, pids);

SET eset = concat(eset, ',', concat(pt_from, ':', pt_to));

IF left(eset, 1) = ',' then

SET eset = substring(eset, 2); -- remove extra comma.

END IF;

IF currentP=pt_from THEN

SET currentP=pt_to;

ELSE

SET currentP=pt_from;

END IF;

IF currentP= endP THEN

SET finished= 1;

END IF;

END;

END IF;

UNTIL done

END REPEAT;

CLOSE cur2;

END

我的问题是游标无法正常工作。 当我将当前行提取到pt_from, pt_to,和pt_dist我得到的都是NULL值。 sampledata表已正确存储在数据库中,并且pids中的所有点ID也都在sampledata表中。 另外,此EXACT代码可用于其他过程,但在此处无法重复使用。

有人知道我在做什么错吗?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值