数据库原理与应用 第 15 章 · 上机五
课程第 15 章上机五 不表态就不让建两条路三条规矩嵌进查询游标四步取到底连续练习 版式
第 15 章 存储过程与函数 · 上机五

自定义函数与游标

课件第 72 到 86 页那两节,函数的三条硬规矩和游标的四步,各撞一遍。
已完成 0 / 6
本 次 上 机 题 目
  1. 01函数不写 DETERMINISTIC,撞 1418
  2. 02表态,或者把开关打开
  3. 03没有 RETURN、吐结果集、参数带 OUT
  4. 04函数比过程灵活的地方
  5. 05声明、打开、一行行取、关掉
  6. 06没有处理程序,FETCH 就撞 1329
  7. 游标算一份成绩单
01
第 15 章 · 上机五

函数不写 DETERMINISTIC,撞 1418

这一条课件没提,可照抄课件的写法一定撞。

Welcome to the MySQL monitor. Commands end with ;
Server version: 8.0.36 MySQL Community Server - GPL
终端一打开就在 teaching 库里,五张表已经装好。这一章要往里面存过程和函数。
mysql>

重 点

拦人的是二进制日志:日志要记函数调用,就得先知道它算不算得准。

知道更多

第 10 章那个 log_bin,在这一章变成了建函数的一道门槛。

想一想

为什么日志会关心函数算不算得准?

02
第 15 章 · 上机五

表态,或者把开关打开

加 DETERMINISTIC,或者把那个信任开关打开。

Welcome to the MySQL monitor. Commands end with ;
Server version: 8.0.36 MySQL Community Server - GPL
终端一打开就在 teaching 库里,五张表已经装好。这一章要往里面存过程和函数。
mysql>

重 点

前一条是正路,后一条是把关卡撤了,生产库上不该这么干。

记牢它三个特征

  1. DETERMINISTIC
  2. NO SQL
  3. READS SQL DATA

想一想

一个函数里写了 NOW(),还能叫 DETERMINISTIC 吗?

03
第 15 章 · 上机五

没有 RETURN、吐结果集、参数带 OUT

1320、1415、1064,三条都在建的时候就拦下来。

Welcome to the MySQL monitor. Commands end with ;
Server version: 8.0.36 MySQL Community Server - GPL
终端一打开就在 teaching 库里,五张表已经装好。这一章要往里面存过程和函数。
mysql>

重 点

函数只能交出一个值,不能交出一张表,也不能靠参数往外带东西。

知道更多

三条都是建的时候查出来的,不用等到调用,省了不少事。

想一想

既然函数不能吐结果集,例 15-3 那种查询该写成什么?

04
第 15 章 · 上机五

函数比过程灵活的地方

同一件事,函数一句话对二十行各算一次。

Welcome to the MySQL monitor. Commands end with ;
Server version: 8.0.36 MySQL Community Server - GPL
终端一打开就在 teaching 库里,五张表已经装好。这一章要往里面存过程和函数。
mysql>

重 点

换成 CALL 就报 1305,它在函数表里,不在过程表里。

知道更多

同样的判断用 CASE WHEN 也能写,封装成函数是为了到处都能用。

想一想

成绩为空的那几行,等级会是什么?

05
第 15 章 · 上机五

声明、打开、一行行取、关掉

游标是把结果集一行行拿出来单独处理的办法。

Welcome to the MySQL monitor. Commands end with ;
Server version: 8.0.36 MySQL Community Server - GPL
终端一打开就在 teaching 库里,五张表已经装好。这一章要往里面存过程和函数。
mysql>

重 点

声明的顺序是硬的:先变量,再游标,最后处理程序,换一个位置就报 1064。

知道更多

FETCH 的变量个数要跟游标那句 SELECT 的列数一样,不一样报 1328。

想一想

少了 CONTINUE HANDLER 那一句会怎么样?

06
第 15 章 · 上机五

没有处理程序,FETCH 就撞 1329

上一题那句 HANDLER 就是专门接这个错的。

Welcome to the MySQL monitor. Commands end with ;
Server version: 8.0.36 MySQL Community Server - GPL
终端一打开就在 teaching 库里,五张表已经装好。这一章要往里面存过程和函数。
mysql>

重 点

一行都没有,第一次 FETCH 就到底了,1329 直接把过程打断。

知道更多

SELECT…INTO 查不到行只记一条警告,FETCH 查不到行是报错,两者不一样。

想一想

把 HANDLER 从 CONTINUE 改成 EXIT,行为差在哪?

第 15 章 · 上机五

游标算一份成绩单

一行行取出来,边取边判断,最后拼成一句话。

Welcome to the MySQL monitor. Commands end with ;
Server version: 8.0.36 MySQL Community Server - GPL
终端一打开就在 teaching 库里,五张表已经装好。这一章要往里面存过程和函数。
mysql>

重 点

s2 四门里有一门没分数,被 ITERATE 跳过去了,剩下三门两及格一不及格。

知道更多

s6 一门没选,游标一开就到底,两个计数都是 0,这一趟也走得通。

想一想

这一题不用游标,两句 SQL 能不能做出来?

保山学院·人工智能教研室·曹鼎鼎