函数不写 DETERMINISTIC,撞 1418
这一条课件没提,可照抄课件的写法一定撞。
重 点
拦人的是二进制日志:日志要记函数调用,就得先知道它算不算得准。
知道更多
第 10 章那个 log_bin,在这一章变成了建函数的一道门槛。
想一想
为什么日志会关心函数算不算得准?
这一条课件没提,可照抄课件的写法一定撞。
拦人的是二进制日志:日志要记函数调用,就得先知道它算不算得准。
第 10 章那个 log_bin,在这一章变成了建函数的一道门槛。
为什么日志会关心函数算不算得准?
加 DETERMINISTIC,或者把那个信任开关打开。
前一条是正路,后一条是把关卡撤了,生产库上不该这么干。
一个函数里写了 NOW(),还能叫 DETERMINISTIC 吗?
1320、1415、1064,三条都在建的时候就拦下来。
函数只能交出一个值,不能交出一张表,也不能靠参数往外带东西。
三条都是建的时候查出来的,不用等到调用,省了不少事。
既然函数不能吐结果集,例 15-3 那种查询该写成什么?
同一件事,函数一句话对二十行各算一次。
换成 CALL 就报 1305,它在函数表里,不在过程表里。
同样的判断用 CASE WHEN 也能写,封装成函数是为了到处都能用。
成绩为空的那几行,等级会是什么?
游标是把结果集一行行拿出来单独处理的办法。
声明的顺序是硬的:先变量,再游标,最后处理程序,换一个位置就报 1064。
FETCH 的变量个数要跟游标那句 SELECT 的列数一样,不一样报 1328。
少了 CONTINUE HANDLER 那一句会怎么样?
上一题那句 HANDLER 就是专门接这个错的。
一行都没有,第一次 FETCH 就到底了,1329 直接把过程打断。
SELECT…INTO 查不到行只记一条警告,FETCH 查不到行是报错,两者不一样。
把 HANDLER 从 CONTINUE 改成 EXIT,行为差在哪?
一行行取出来,边取边判断,最后拼成一句话。
s2 四门里有一门没分数,被 ITERATE 跳过去了,剩下三门两及格一不及格。
s6 一门没选,游标一开就到底,两个计数都是 0,这一趟也走得通。
这一题不用游标,两句 SQL 能不能做出来?