轮到函数了
跟过程比,函数少一样东西,多一条硬规矩。

重 点
少的是 OUT 参数,多的是必须 RETURN 一个值。
知道更多
少了那一样反而换来一件过程做不到的事:能嵌进 SELECT 里。
想一想
既然过程能做的事更多,为什么还要函数?
跟过程比,函数少一样东西,多一条硬规矩。

少的是 OUT 参数,多的是必须 RETURN 一个值。
少了那一样反而换来一件过程做不到的事:能嵌进 SELECT 里。
既然过程能做的事更多,为什么还要函数?
RETURNS 声明类型,函数体里 RETURN 值。

RETURNS 带 S 写在头上说类型,RETURN 不带 S 写在体里给值,别搞混。
课件这一页也把 CREATE 拼成了 CREAE,第 54 页同一个错。
课件没提这一条,照抄一定撞 1418。

拦人的是二进制日志:日志要记函数调用,就得先知道它算不算得准。
第 10 章那个 log_bin,在这一章变成了建函数的一道门槛。
为什么日志会关心函数算不算得准?
三条都在建的时候就拦下来。

SELECT 函数名(参数),不用 CALL。

这就是函数最值钱的地方:嵌进 SELECT,对每一行各算一次。
内置的 NOW()、COUNT() 怎么用,自己写的函数就怎么用。
同样的判断用 CASE WHEN 也能写,为什么还要封装成函数?
跟看过程的那两条一模一样,只是换个词。

| 看过程 | 看函数 |
|---|---|
| SHOW PROCEDURE | SHOW FUNCTION |
| STATUS 看状态 | STATUS 看状态 |
SHOW CREATE FUNCTION 看代码,SHOW FUNCTION STATUS 看状态。
跟 ALTER PROCEDURE 是同一个道理。

函数体照样改不了,要换代码还是 DROP 了重建。
把安全类型改成 INVOKER,函数就按调用者的权限去读表。
图形界面上点「修改」,背后也是重建。

工具把 DROP 和 CREATE 两步包在一个按钮里,本质没变。
所以函数的代码要在本地留一份,光靠库里那一份,改坏了没处找。
改函数的时候,正在用它的查询会怎样?
删不存在的报 1305。

函数和过程是两张表,同名的过程和函数可以并存,删的时候别删错。
函数只能返回一个值。函数体里放一句不带 INTO 的 SELECT,建的时候就报 1415。