现在开始建真的存储过程
前面几节的零件,这一节全用上。

重 点
六件事:创建、调用、查看、修改、删除、参数。这一节先讲前两件。
知道更多
从这一节起,每一条语句都能在上机页里敲一遍,敲完就记住了。
想一想
回想一下,写存储过程的标准模板是什么?
前面几节的零件,这一节全用上。

六件事:创建、调用、查看、修改、删除、参数。这一节先讲前两件。
从这一节起,每一条语句都能在上机页里敲一遍,敲完就记住了。
回想一下,写存储过程的标准模板是什么?
菜单点出来的还是同一段代码,学会敲的那一种就够。

用哪种工具不重要,重要的是那六步一步都不能少。
当前用户得有 CREATE ROUTINE 权限才建得了,这是第 8 章那套权限。
括号里是参数,BEGIN…END 里是过程体。

告诉服务器这个过程算不算得准、要不要读表。

过程可以不写,函数不写就建不起来。这一条课件没提,下一节要撞一次。
DETERMINISTIC 的意思是:同样的输入一定给同样的输出。
按定义者的权限跑,还是按调用者的权限跑。

| 写法 | 按谁的权限 |
|---|---|
| DEFINER | 建它的人 |
| INVOKER | 调它的人 |
默认是 DEFINER,所以普通用户调一个 root 建的过程,也能碰到 root 才碰得到的表。
这两种设置各适合什么场合?
最简单的一个,正好把模板走一遍。

课件这一题的要求,其实做不到。

课件要求没选课的显示 NULL,可 COUNT 数出来是 0,不是 NULL。
真要 NULL,得在外面再套一层 NULLIF(COUNT(sc.cno),0)。
这一处显示 0 和显示 NULL,哪个更合业务?
有参数就在括号里给,没参数括号可以省。

创建只是把它存进库里,CALL 才是真的执行。这两件事要分清。
建好之后关掉客户端再连进来,它还在吗?
本质上还是发一句 CALL 过去。

菜单上点出来的和手敲的是同一句话,工具只是替你把语句拼好。
学会在代码窗口里敲,换成命令行、换成程序里调,都是一回事。