【问题标题】:How to get table values with stored procedure, cursor and for loop?如何使用存储过程、游标和 for 循环获取表值?
【发布时间】:2021-02-14 18:29:53
【问题描述】:

我正在构建一个使用游标和循环的存储过程。我了解代码的工作原理,但在创建条件时遇到了麻烦。我不明白如何根据输入参数调用代码来检查某些单元格中的空值。

我的代码解释: 我正在检查会员是否有任何过期书籍。在我称为“borrowedby”的表中,有变量“MemberID”、“ReturnDate”和“BookID”。 ReturnDate 是图书归还的日期。输入参数“memberIDEN”必须等于“MemberID”并检查“ReturnDate”是否为空。如果它为空,那么我打印出 memberID 和过期的书籍。

如何创建一个条件来检查表 'borrowedby' 中的 'ReturnDate' 是否为空?

delimiter //
drop procedure if exists overdueBooks  //

delimiter //
create procedure overdueBooks  (in memberid INT)

begin
declare returnCheck date;
declare finished int default 0;
declare overdueList varchar (100) default "";

declare cursor_data cursor for 
select MemberID 
from borrowedby 
where memberid = MemberID;

declare continue handler for not found set finished = 1;

open cursor_data;

get_members: loop
    fetch cursor_data into overdueList;
    
    if returnCheck is not null 
        then
            leave get_members;
    end if;
end loop get_members;
close cursor_data;
end
//
delimiter ;

【问题讨论】:

    标签: mysql for-loop stored-procedures cursor procedure


    【解决方案1】:

    看来SP是多余的。

    SELECT *
    FROM borrowedby 
    WHERE @memberIDEN = MemberID
      AND returnCheck IS NULL
    

    此查询返回指定成员的所有未归还的书籍。

    【讨论】:

      【解决方案2】:

      我同意带光标的 sp 不是要走的路,但是.. sp 有很多问题

      1. 您没有在光标选择中抓取您需要的所有字段
      2. 您已正确声明了一个处理程序,但您没有在循环中进行测试,因此您的循环是无限的。
      3. fetch 应该获取它需要的所有列
      4. 如果您确实找到了过期图书,那么一旦获取数据,您就不会对数据进行任何处理。
      5. 您不适合借款人同时存在逾期和归还的情况。

      给出的修正SP

      DROP TABLE IF EXISTS T;
      CREATE TABLE T
      (MemberID INT, ReturnDate DATE,BookID INT);
      
      INSERT INTO T VALUES
      (1,NULL,1),(1,NULL,3),(2,'2020-11-02',2);
      
      delimiter //
      
      create procedure P  (in memberIDEN INT)
      
      begin
      declare returnCheck date;
      declare finished int default 0;
      declare overdueList varchar (100) default "";
      
      declare cursor_data cursor for 
      select MemberID ,RETURNDATE from T where memberIDEN = MemberID;
      
      declare continue handler for not found set finished = 1;
      
      open cursor_data;
      
      get_members: loop
          fetch cursor_data into overdueList,RETURNCHECK;
          
           IF FINISHED = 1 THEN
              LEAVE GET_MEMBERS;
          END IF;
              
          fetch cursor_data into overdueList,RETURNCHECK;
          
          if returnCheck is NULL then
                  SELECT OVERDUELIST ' HAS OVERDUE BOOK(S)';
          end if;
      end loop get_members;
      close cursor_data;
      end //
      delimiter ;
      

      【讨论】:

      • 非常感谢@P.Salmon,这实际上解释了很多。我仍在学习游标和过程的工作原理。我现在正在用两张表检查条件。如果给定 bookID,有没有办法打印 outdueList?
      猜你喜欢
      • 1970-01-01
      • 2011-03-14
      • 1970-01-01
      • 1970-01-01
      • 2019-04-29
      • 1970-01-01
      • 2018-08-28
      • 2013-09-28
      • 1970-01-01
      相关资源
      最近更新 更多