gpt4 book ai didi

mysql 存储过程无法在 mysqlworkbench 或 java 代码中运行

转载 作者:行者123 更新时间:2023-11-30 00:59:46 25 4
gpt4 key购买 nike

我在mysql中编写了一个存储过程,当我通过漏斗运行它时,它工作正常,但是当我尝试从mysql工作台或java运行它时,它没有返回任何结果,也没有显示任何异常

我请求您在这方面帮助我

-- --------------------------------------------------------------------------------
-- Routine DDL
-- Note: comments before and after the routine body will not be stored by the server
-- --------------------------------------------------------------------------------
DELIMITER $$

CREATE DEFINER=`root`@`localhost` PROCEDURE `issueitem`()
BEGIN
DECLARE done INT DEFAULT 0;
DECLARE inventoryids INT DEFAULT 0;
DECLARE batch varchar(39);
DECLARE resultstr varchar(3000) DEFAULT '';
DECLARE exp DATE;
DECLARE mfgdate DATE;
DECLARE availableunit INT;
DECLARE quantity INT DEFAULT 100;
DECLARE oldest_date DATETIME;
DECLARE cur_count INT;
DECLARE que_size INT DEFAULT 0;
DECLARE curs CURSOR FOR SELECT inventoryid,batch,exp,availableunit FROM aashramdata.inventory where itemid=1 ORDER BY exp ASC;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;

OPEN curs;
SET cur_count=quantity;
read_loop: LOOP
FETCH curs INTO inventoryids,batch,exp,availableunit;
IF done THEN
LEAVE read_loop;
END IF;
SET que_size = que_size + availableunit;
IF cur_count >= availableunit THEN
set cur_count=cur_count-availableunit;
set resultstr=CONCAT(resultstr,batch,' - ',exp,' - ',availableunit,' - ');
update aashramdata.inventory set `availableunit`=0 where inventoryid=inventoryids;
END IF;
IF cur_count < availableunit THEN

update aashramdata.inventory set `availableunit`=availableunit-cur_count where inventoryid=inventoryids;
set resultstr=CONCAT(resultstr,batch,' - ',exp,' - ',availableunit-cur_count,' - ');

set cur_count=0;
END IF;
IF que_size >= quantity then
LEAVE read_loop;
END IF;
END LOOP;

CLOSE curs;
select resultstr;
END

最佳答案

由于该过程在语法上显然是有效的,因此如果不了解一些数据,就不可能回答问题可能是什么。

调试存储过程的最简单方法是用无界 SELECT 填充它。语句(即,选择不属于子查询的一部分,也不属于 INSERT ... SELECTSELECT ... INTO 的一部分),然后从 MySQL 命令行客户端运行它,这比大多数命令更优雅地处理来自存储过程的多个结果集图形客户端。

例如:

...
SET cur_count=quantity;
SELECT cur_count; -- add this
read_loop: LOOP
FETCH curs INTO inventoryids,batch,exp,availableunit;
SELECT inventoryids,batch,exp,availableunit; -- add this
SELECT done; -- add this
IF done THEN
...

当从命令行客户端运行时...

mysql> CALL issueitem();

...输出将开始从控制台向您滚动,向您显示该过程在迭代循环时遇到的内部值。

这个或其他SELECT像这样在其他地方添加的语句将公开内部变量,这应该可以帮助您找到问题。您需要在从代码甚至 GUI 调用过程之前删除它们,因为 GUI 可能无法很好地处理它们 - 它可能会开始打开新选项卡或拆分 Pane ,或者只是忽略第一个 SELECT 之后的所有内容。 .

请注意,在循环的最后一次迭代中,您可能会看到上一次迭代中的值重复出现,因为从游标读取失败可能不会重置变量,但“done”也会从 0 转换为 1,表明游标已完成已用完行并触发 CONTINUE HANDLER ,因此这些值实际上不会被处理两次。

关于mysql 存储过程无法在 mysqlworkbench 或 java 代码中运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20249189/

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