更新 ch05_SQL高级处理.md

This commit is contained in:
mba1398 2025-04-07 17:01:47 +08:00 committed by GitHub
parent 52e7dc3a50
commit 74a47dc35f
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
1 changed files with 7 additions and 0 deletions

View File

@ -223,6 +223,10 @@ CREATE
`routine_body` 由一个有效的SQL例程语句组成。它可以是一个简单的语句 **(通常以分号 `;` 结尾)**`SELECT``INSERT`,或一个使用 `BEGIN``END` 编写的复合语句。复合语句可以包含声明、循环和其他控制结构语句。在实践中,存储函数倾向于使用复合语句,除非例程主体由一个 `RETURN` 语句组成。
另外,你可能注意到了,这里特别提到了特殊分隔符 // 或者 $$。那么,他们是必须使用的吗?答案是否定的,只有在你使用命令行模式创建存储过程时,必须使用特殊分隔符来与分号进行区分,因为 SQL 语句的默认分隔符是分号,而存储过程通常包含多条 SQL 语句每条语句都以分号结尾。如果不修改分隔符SQL 语句在执行时遇到第一个分号时,认为当前语句已经结束,进而尝试执行它,从而无法完整创建包含 BEGIN ... END 块的存储过程,导致创建失败。
当你使用 SQL 客户端来创建存储过程时,不存在这个问题,无需修改分隔符。
### 5.5.2 参数介绍
存储过程和函数的参数有三类,分别是:`IN``OUT``INOUT`,其中:
@ -237,6 +241,7 @@ CREATE
- 查询
下面的示例显示了一个简单的存储过程,给定一个国家代码,计算在 `world` 数据库的城市表中出现的该国家的城市数量。使用 `IN` 参数传递国家代码,使用 `OUT` 参数返回城市计数:
```sql
-- 命令行执行模式
DELIMITER //
DROP PROCEDURE IF EXISTS citycount //
@ -256,6 +261,7 @@ SELECT @cities;
- 创建表
```SQL
-- 命令行执行模式
use world;
DELIMITER $$
@ -274,6 +280,7 @@ show tables;
```
- 插入数据
```SQL
-- 使用 SQL 客户端进行创建
CREATE DEFINER=`root`@`localhost` PROCEDURE `insert_product_test`()
BEGIN
declare i int;