Skip to content

Commit deb20c5

Browse files
committed
添加第4~16章
1 parent 90d73f7 commit deb20c5

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

65 files changed

+5113
-14
lines changed

.github/workflows/ci.yml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,10 @@ jobs:
88
Build:
99
runs-on: ubuntu-latest
1010
steps:
11-
- uses: actions/checkout@v4
12-
- uses: actions/setup-node@v4
11+
- uses: actions/checkout@v6
12+
- uses: actions/setup-node@v6
1313
with:
14-
node-version: 20
14+
node-version: 24
1515
registry-url: 'https://registry.npmjs.org'
1616

1717
- run: npm install

README.md

Lines changed: 282 additions & 7 deletions
Large diffs are not rendered by default.

docs/chapter10/10.1.md

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
存储过程和函数的概述
2+
===
3+
4+
存储过程和存储函数都属于 MySQL 中的可编程对象。它们可以把多条 SQL 和业务逻辑封装起来,减少重复代码,提高复用性,并把一部分处理逻辑放在数据库内部执行。
5+
6+
### 什么是存储过程和函数
7+
8+
存储过程(Stored Procedure)是保存在数据库中的一组 SQL 语句集合,可以被显式调用执行。
9+
10+
例如,用户开户、订单结算、批量更新等操作,如果涉及多条 SQL,就可以封装成存储过程。
11+
12+
存储函数(Stored Function)则更像一个“可返回值的函数”,通常接收参数并返回一个结果,常用于表达式计算和查询中。
13+
14+
简单理解:
15+
16+
- 存储过程更像“执行一段流程”
17+
- 存储函数更像“根据输入返回一个值”
18+
19+
### 存储过程和函数的区别
20+
21+
它们的主要区别包括:
22+
23+
1. 存储过程使用 `CALL` 调用,存储函数可以直接写在表达式里。
24+
2. 存储过程可以没有返回值,也可以通过参数返回多个结果;存储函数必须有返回值。
25+
3. 存储过程更适合封装业务流程;存储函数更适合封装可复用计算逻辑。
26+
27+
例如:
28+
29+
- “创建订单并记录日志”更适合存储过程
30+
- “根据成绩返回等级”更适合存储函数
31+
32+
### 小结
33+
34+
如果你的目标是封装一系列操作流程,优先考虑存储过程;如果你的目标是返回一个可复用的计算结果,优先考虑存储函数。

docs/chapter10/10.2.md

Lines changed: 156 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,156 @@
1+
创建存储过程和函数
2+
===
3+
4+
创建存储过程和函数时,通常需要先切换语句结束符,因为过程体内部往往会包含多条 SQL。
5+
6+
### 创建存储过程
7+
8+
基本语法如下:
9+
10+
```sql
11+
DELIMITER //
12+
13+
CREATE PROCEDURE 过程名()
14+
BEGIN
15+
SQL语句;
16+
END //
17+
18+
DELIMITER ;
19+
```
20+
21+
示例:
22+
23+
```sql
24+
DELIMITER //
25+
26+
CREATE PROCEDURE get_all_user()
27+
BEGIN
28+
SELECT * FROM user;
29+
END //
30+
31+
DELIMITER ;
32+
```
33+
34+
创建完成后,就可以通过过程名调用它。
35+
36+
### 创建存储函数
37+
38+
基本语法如下:
39+
40+
```sql
41+
DELIMITER //
42+
43+
CREATE FUNCTION 函数名(参数列表)
44+
RETURNS 返回类型
45+
BEGIN
46+
RETURN 表达式;
47+
END //
48+
49+
DELIMITER ;
50+
```
51+
52+
示例:
53+
54+
```sql
55+
DELIMITER //
56+
57+
CREATE FUNCTION get_level(score INT)
58+
RETURNS VARCHAR(10)
59+
BEGIN
60+
RETURN CASE
61+
WHEN score >= 90 THEN '优秀'
62+
WHEN score >= 60 THEN '及格'
63+
ELSE '不及格'
64+
END;
65+
END //
66+
67+
DELIMITER ;
68+
```
69+
70+
### 变量的使用
71+
72+
在存储过程和函数中可以定义局部变量。
73+
74+
语法:
75+
76+
```sql
77+
DECLARE 变量名 数据类型 [DEFAULT 默认值];
78+
```
79+
80+
示例:
81+
82+
```sql
83+
DELIMITER //
84+
85+
CREATE PROCEDURE demo_var()
86+
BEGIN
87+
DECLARE total INT DEFAULT 0;
88+
SET total = 100;
89+
SELECT total;
90+
END //
91+
92+
DELIMITER ;
93+
```
94+
95+
### 定义条件和处理程序
96+
97+
当过程执行时可能遇到异常或特定状态,可以定义条件和处理程序。
98+
99+
常见写法如下:
100+
101+
```sql
102+
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION
103+
SET @has_error = 1;
104+
```
105+
106+
这表示当发生 SQL 异常时,不终止过程,而是执行对应处理逻辑。
107+
108+
它适合:
109+
110+
- 捕获异常
111+
- 控制事务回滚
112+
- 记录错误状态
113+
114+
### 光标的使用
115+
116+
光标(Cursor)用于逐行处理查询结果集。
117+
118+
常见步骤包括:
119+
120+
1. 定义光标
121+
2. 打开光标
122+
3. 逐行读取
123+
4. 关闭光标
124+
125+
例如:
126+
127+
```sql
128+
DECLARE cur CURSOR FOR
129+
SELECT id, name FROM user;
130+
```
131+
132+
光标更适合需要逐行处理的复杂业务逻辑,但在很多场景中,集合化 SQL 往往比逐行处理更高效。
133+
134+
### 流程控制的使用
135+
136+
存储过程和函数中也支持基本流程控制,例如:
137+
138+
- `IF ... THEN ... ELSE`
139+
- `CASE`
140+
- `WHILE`
141+
- `LOOP`
142+
- `REPEAT`
143+
144+
例如:
145+
146+
```sql
147+
IF total > 0 THEN
148+
SELECT '有数据';
149+
ELSE
150+
SELECT '无数据';
151+
END IF;
152+
```
153+
154+
### 小结
155+
156+
创建存储过程和函数的关键在于三点:切换分隔符、明确过程体结构、合理使用变量和流程控制。真正复杂的地方不是语法,而是过程内部的业务逻辑设计。

docs/chapter10/10.3.md

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
调用存储过程和函数
2+
===
3+
4+
创建完成后,就可以调用存储过程和存储函数。调用方式是它们之间最直观的差别之一。
5+
6+
### 调用存储过程
7+
8+
存储过程使用 `CALL` 调用。
9+
10+
基本语法如下:
11+
12+
```sql
13+
CALL 过程名(参数列表);
14+
```
15+
16+
例如调用不带参数的存储过程:
17+
18+
```sql
19+
CALL get_all_user();
20+
```
21+
22+
如果过程带参数,则按顺序传入即可:
23+
24+
```sql
25+
CALL create_order(1, 100.00);
26+
```
27+
28+
### 调用存储函数
29+
30+
存储函数通常像普通函数一样使用,可以直接写在 `SELECT``WHERE``SET` 等表达式中。
31+
32+
例如:
33+
34+
```sql
35+
SELECT get_level(95);
36+
```
37+
38+
也可以在查询中配合字段一起使用:
39+
40+
```sql
41+
SELECT name, score, get_level(score) AS level
42+
FROM exam_result;
43+
```
44+
45+
这也是存储函数和存储过程的重要区别之一:函数更适合参与表达式计算。
46+
47+
### 小结
48+
49+
存储过程用 `CALL` 调用,存储函数则像普通函数一样嵌入 SQL 表达式。一个偏“执行过程”,一个偏“返回值计算”。

docs/chapter10/10.4.md

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
查看存储过程和函数
2+
===
3+
4+
创建完存储过程和函数后,通常需要查看它们的定义、状态和元数据。MySQL 提供了多种方式来完成这类操作。
5+
6+
### SHOW STATUS语句查看存储过程和函数的状态
7+
8+
可以使用 `SHOW PROCEDURE STATUS``SHOW FUNCTION STATUS` 查看基本状态信息。
9+
10+
例如:
11+
12+
```sql
13+
SHOW PROCEDURE STATUS;
14+
SHOW FUNCTION STATUS;
15+
```
16+
17+
如果只想查看当前数据库下的对象,也可以加筛选条件。
18+
19+
这些结果通常会包含:
20+
21+
- 对象名称
22+
- 所属数据库
23+
- 创建时间
24+
- 修改时间
25+
- 定义者
26+
27+
### SHOW CREATE语句查看存储过程和函数的定义
28+
29+
如果想查看完整定义,可以使用:
30+
31+
```sql
32+
SHOW CREATE PROCEDURE 过程名;
33+
SHOW CREATE FUNCTION 函数名;
34+
```
35+
36+
例如:
37+
38+
```sql
39+
SHOW CREATE PROCEDURE get_all_user;
40+
SHOW CREATE FUNCTION get_level;
41+
```
42+
43+
这样可以直接看到创建时的完整 SQL 定义。
44+
45+
### 从information_schema.Routines表中查看存储过程和函数的信息
46+
47+
MySQL 也可以通过 `information_schema.ROUTINES` 视图查看过程和函数信息。
48+
49+
例如:
50+
51+
```sql
52+
SELECT ROUTINE_NAME, ROUTINE_TYPE, CREATED, LAST_ALTERED
53+
FROM information_schema.ROUTINES
54+
WHERE ROUTINE_SCHEMA = DATABASE();
55+
```
56+
57+
这种方式适合:
58+
59+
- 批量查看
60+
- 条件筛选
61+
- 脚本化管理
62+
63+
### 小结
64+
65+
看状态可以用 `SHOW ... STATUS`,看定义可以用 `SHOW CREATE ...`,做批量化和条件化查询时则可以使用 `information_schema.ROUTINES`

docs/chapter10/10.5.md

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
修改存储过程和函数
2+
===
3+
4+
存储过程和函数创建完成后,有时需要调整注释、特性或执行属性。这时通常使用 `ALTER` 语句。
5+
6+
### 使用ALTER语句修改存储过程和函数
7+
8+
基本语法如下:
9+
10+
```sql
11+
ALTER PROCEDURE 过程名 [特性修改];
12+
ALTER FUNCTION 函数名 [特性修改];
13+
```
14+
15+
例如修改注释:
16+
17+
```sql
18+
ALTER PROCEDURE get_all_user COMMENT '查询所有用户';
19+
ALTER FUNCTION get_level COMMENT '根据分数返回等级';
20+
```
21+
22+
需要注意的是:
23+
24+
1. `ALTER PROCEDURE``ALTER FUNCTION` 能修改的内容有限。
25+
2. 如果要修改过程体或函数体,通常做法是先删除再重新创建。
26+
27+
### 小结
28+
29+
`ALTER` 更适合调整过程和函数的属性,而不适合大幅改写主体逻辑。真正改业务逻辑时,通常还是重新创建更直接。

0 commit comments

Comments
 (0)