数据库原理与应用 第 15 章 · 第九节
课程第 15 章第九节 第九节建函数必撞一次三条硬规矩调函数看函数改特征改代码删函数 版式
第 15 章 存储过程与函数 · 第九节

用户自定义函数

本 节 知 识 点
  1. 72轮到函数了
  2. 73CREATE FUNCTION,多两行
  3. 74不写 DETERMINISTIC 建不起来
  4. 75没 RETURN、吐结果集、参数带 OUT
  5. 76像内置函数一样直接用
  6. 77SHOW FUNCTION STATUS
  7. 78ALTER FUNCTION 也只改特征
  8. 79还是删了重建那一条路
  9. 80DROP FUNCTION,同样建议加 IF EXISTS
72
第 15 章 · 第九节

轮到函数了

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

第 72 页课件

重 点

少的是 OUT 参数,多的是必须 RETURN 一个值。

知道更多

少了那一样反而换来一件过程做不到的事:能嵌进 SELECT 里。

想一想

既然过程能做的事更多,为什么还要函数?

73
第 15 章 · 第九节

CREATE FUNCTION,多两行

RETURNS 声明类型,函数体里 RETURN 值。

第 73 页课件

试一试同一件事,过程和函数各写一遍

同一件事:按分数给等级

重 点

RETURNS 带 S 写在头上说类型,RETURN 不带 S 写在体里给值,别搞混。

知道更多

课件这一页也把 CREATE 拼成了 CREAE,第 54 页同一个错。

上机做

上机五第 2 题 建第一个函数

74
第 15 章 · 第九节

不写 DETERMINISTIC 建不起来

课件没提这一条,照抄一定撞 1418。

第 74 页课件

重 点

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

知道更多

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

上机做

上机五第 1 题 撞一次 1418

想一想

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

75
第 15 章 · 第九节

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

三条都在建的时候就拦下来。

第 75 页课件

记牢它三个报错

  1. 1320 没有 RETURN
  2. 1415 吐了结果集
  3. 1064 参数写了 OUT

重 点

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

上机做

上机五第 3 题 三条各撞一次

76
第 15 章 · 第九节

像内置函数一样直接用

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

第 76 页课件

重 点

这就是函数最值钱的地方:嵌进 SELECT,对每一行各算一次。

打个比方

内置的 NOW()、COUNT() 怎么用,自己写的函数就怎么用。

上机做

上机五第 4 题 嵌进 SELECT 里

想一想

同样的判断用 CASE WHEN 也能写,为什么还要封装成函数?

77
第 15 章 · 第九节

SHOW FUNCTION STATUS

跟看过程的那两条一模一样,只是换个词。

第 77 页课件

分清楚两组语句

看过程看函数
SHOW PROCEDURESHOW FUNCTION
STATUS 看状态STATUS 看状态

重 点

SHOW CREATE FUNCTION 看代码,SHOW FUNCTION STATUS 看状态。

78
第 15 章 · 第九节

ALTER FUNCTION 也只改特征

跟 ALTER PROCEDURE 是同一个道理。

第 78 页课件

重 点

函数体照样改不了,要换代码还是 DROP 了重建。

知道更多

把安全类型改成 INVOKER,函数就按调用者的权限去读表。

79
第 15 章 · 第九节

还是删了重建那一条路

图形界面上点「修改」,背后也是重建。

第 79 页课件

重 点

工具把 DROP 和 CREATE 两步包在一个按钮里,本质没变。

知道更多

所以函数的代码要在本地留一份,光靠库里那一份,改坏了没处找。

想一想

改函数的时候,正在用它的查询会怎样?

80
第 15 章 · 第九节

DROP FUNCTION,同样建议加 IF EXISTS

删不存在的报 1305。

第 80 页课件

重 点

函数和过程是两张表,同名的过程和函数可以并存,删的时候别删错。

上机做

上机五第 4 题 CALL 一个函数试试

练一练

下列关于自定义函数的说法,错误的是?
  1. A函数体中必须有 RETURN 语句
  2. B函数的参数只能是 IN 类型
  3. C函数可以返回一个结果集
  4. D函数可以嵌入 SELECT 语句中
答案 C

函数只能返回一个值。函数体里放一句不带 INTO 的 SELECT,建的时候就报 1415。

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