【问题标题】:mysql stored proc is not working from mysqlworkbench or java codemysql 存储过程不能从 mysqlworkbench 或 java 代码工作
【发布时间】:2013-11-27 17:30:49
【问题描述】:

当我通过 hopper 运行它时,我在 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

【问题讨论】:

  • 谁能帮帮我

标签: mysql database stored-procedures


【解决方案1】:

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

调试存储过程的最简单方法是使用无限的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 可能无法很好地处理它们——它可能会开始打开新选项卡或拆分窗格,或者只是忽略第一个 SELECT 之后的所有内容。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-12
    相关资源
    最近更新 更多