diff --git a/ch05_SQL高级处理.md b/ch05_SQL高级处理.md index 32e2417..140a0fa 100644 --- a/ch05_SQL高级处理.md +++ b/ch05_SQL高级处理.md @@ -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;