• 朱晓峰
    置顶
    2021-05-17
    你好,我是朱晓峰,下面我就来公布一下上节课思考题的答案: 上节课,我们学习了存储过程。下面是思考题的答案: DELIMITER // CREATE PROCEDURE demo.test(IN a INT,OUT b INT) BEGIN SET b = a + 1; END // DELIMITER ;
    共 1 条评论
    1
  • 虹炎
    2021-05-18
    这里没看懂: DECLARE done INT DEFAULT FALSE; -- 用来控制循环结束 -- done 是int 类型,默认又是false?? REPEAT ...... 省略 UNTIL done END REPEAT; -- repeat 内容执行一次后,这个done 应该是false ,就直接退出了循环呢??

    作者回复: MySQL没有boolean类型,把true处理为1,把false处理为0。 UNTIL done,表示一直到done为true才退出。

    
    4
  • 彭彬
    2021-09-22
    MySQL的语法变态到了极点,从Oracle中取一点,从SQL Server中取一点,要把学生搞晕

    作者回复: ?

    
    2
  • lesserror
    2021-04-17
    游标这块儿知识比较模糊,以后如果要使用游标,看这一讲基本够了,老师讲的很细致。以下是简单的总结: 1. 游标只能在存储程序内使用,存储程序包括存储过程和存储函数。 2. 游标为逐条读取结果集中的数据,提供了完美的解决方案。因为不需要后端语言写循环,造成与服务器端MySQL程序产生多次交互。 3. 游标用完就要马上关闭,避免造成性能损耗。

    作者回复: 对的

    
    1
  • Judy
    2022-05-10 来自北京
    老师没有讲 数据库的锁机制吗?:(

    作者回复: 这个议题,超出了这门课的涉及范围,在丁奇老师的《MySQL实战45讲》中,有详细论述,建议您订阅。

    
    
  • 孙念池
    2022-02-08
    游标的场景是逐条处理,那么用程序写个循环也能实现同样效果吧,只是比起用sql的游标安全性低?效率低?

    作者回复: 我理解你的意思对比存储程序和程序,我的观点是,存储程序的运行效率更高一些,安全性也更好一些,但是维护成本也更高。

    
    
  • Geek_9a859a
    2021-12-23
    delimiter // create procedure demo.test()-- 创建存储过程 begin declare myid int; declare done int default 1;-- 用于循环中的条件判断如果done为1则继续循环,为0则退出循环 declare cursor_test cursor for-- 定义游标,结果集为test16表中的所有Id select Id from demo.test16; declare continue handler for not found set done = 0;-- 异常处理,当循环中fetch不到下一条数据时修改done的值退出循环 open cursor_test;-- 打开游标 fetch cursor_test into myid;-- 获取一条数据 while done-- 进入循环处理数据 do if myid % 2 = 1 then update demo.test16 set Myquant = Myquant + 2 where Id = myid;-- 当myid为奇数时 else update demo.test16 set Myquant = Myquant + 1 where Id = myid;-- 当myid为偶数时 end if;-- 结束条件判断 fetch cursor_test into myid;-- 获取下一条信息 end while; close cursor_test;-- 关闭游标 end // delimiter ;
    展开

    作者回复: 请参考思考题答案

    
    
  • 大聖
    2021-08-02
    CREATE DEFINER=`root`@`localhost` PROCEDURE `test_cursor`() begin declare quant int; declare my_id int; declare done int default FALSE; declare test_cursor cursor for select id, myquant from demo.test; declare continue handler for not found set done = true; open test_cursor; repeat fetch test_cursor into my_id, quant; if my_id % 2 = 0 then select quant as debug, my_id as id; update demo.test set myquant=quant + 1 where id = my_id; else update demo.test set myquant=quant + 2 where id = my_id; end if; until done end repeat; close test_cursor; end

    作者回复: 请参考思考题答案

    
    
  • 凯
    2021-06-13
    -> DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; -- 条件处理语句 -> -> OPEN cursor_importdata; -- 打开游标 -> FETCH cursor_importdata INTO mystockid,myitemnumber,myquantity,myprice; -- 读入第一条记录 -> REPEAT 打开游标,不能放到DECLARE CONTINUE HANDLER FOR ... 之前么?放到之前就报错。

    作者回复: 在存储程序中,定义语句要放在最前面,然后才可以执行打开光标的操作。

    
    
  • giteebravo
    2021-04-16
    游标 适用于需要对集合中的行进行单独处理的场景。

    作者回复: 是的

    
    