数据库存储过程

MySQL 存储过程是⼀组 预编译的 SQL 语句 ,可以在 MySQL 数据库中 定义和存储 ,并在 需要时执⾏ 。存储过程可
以接受参数、执⾏条件判断、循环、异常处理等操作,使得开发⼈员可以把⼀系列操作组合成⼀个可重复使⽤的单
元,从⽽提⾼代码的复⽤性和可维护性。
存储过程可以在 MySQL 数据库中创建和保存,然后在需要时调⽤。存储过程通常⽤于执⾏复杂的数据操作,例如
数据转换、数据清理、数据分析等。存储过程的执⾏速度通常⽐单个 SQL 语句的执⾏速度更快,因为存储过程是
预编译的,并且可以在多个客户端之间共享。
MySQL 存储过程的语法类似于其他编程语⾔,包括变量定义、条件语句、循环语句、异常处理等。存储过程可以
接受输⼊参数和输出参数,以及返回值。存储过程还可以使⽤游标来处理结果集,并且可以调⽤其他存储过程或函
数。

存储过程保存在mysql.proc表中

# 创建存储过程
CREATE PROCEDURE sp_name ([ proc_parameter [,proc_parameter ...]])
其中:proc_parameter : [IN|OUT|INOUT] parameter_name type
其中IN表示输⼊参数,OUT表示输出参数,INOUT表示既可以输⼊也可以输出;param_name表示参数名称;type表示
参数的类型

# 查看存储过程列表
SHOW PROCEDURE STATUS\G

# 查看存储过程定义
SHOW CREATE PROCEDURE sp_name

# 调⽤存储过程
CALL sp_name ([ proc_parameter [,proc_parameter ...]])
CALL sp_name
说明:当⽆参时,可以省略"()",当有参数时,不可省略"()"

# 存储过程修改
ALTER语句修改存储过程只能修改存储过程的注释等⽆关紧要的东⻄,不能修改存储过程体,所以要修改存储过程,⽅法
就是删除重建

# 删除存储过程
DROP PROCEDURE [IF EXISTS] sp_name

# 优势
存储过程把经常使⽤的SQL语句或业务逻辑封装起来,预编译保存在数据库中,当需要时从数据库中直接调⽤,省去了
编译的过程
提⾼了运⾏速度,同时降低⽹络数据传输量,存储过程相当于独⽴命令可以直接调⽤
1. 提⾼性能
2. 提⾼安全性
3. 提⾼可维护性
4. 提⾼可重⽤性
5. ⽀持事务处理 ACID

# 存储过程与⾃定义函数的区别
1. 返回值类型不同:⾃定义函数必须返回⼀个值,⽽存储过程可以不返回任何值。
2. 使⽤⽅式不同:⾃定义函数可以在SQL语句中使⽤,如SELECT语句中的函数调⽤,⽽存储过程需要通过CALL
语句来调⽤。
3. 事务处理能⼒不同:存储过程可以包含事务处理代码,⽽⾃定义函数不能。
4. 参数传递⽅式不同:⾃定义函数只能通过参数传递来接收输⼊值,并返回计算结果。⽽存储过程可以通过输
⼊、输出、输⼊输出三种参数类型来传递参数。
5. 可重⽤性不同:⾃定义函数可以在多个查询中使⽤,⽽存储过程需要单独调⽤。

# 创建⼀个显示当前时间的储存过程⽆参数
mysql> delimiter //
mysql> CREATE PROCEDURE showTime()
    ->  BEGIN
    ->  SELECT now();
    ->  END//
Query OK, 0 rows affected (0.00 sec)
mysql> delimiter ;

mysql> CALL showTime;
+---------------------+
| now()               |
+---------------------+
| 2025-03-12 15:09:18 |
+---------------------+
1 row in set (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

# 查看存储过程:
mysql> show procedure status like 'showTime'\G
*************************** 1. row ***************************
                  Db: test
                Name: showTime
                Type: PROCEDURE
             Definer: root@localhost
            Modified: 2025-03-12 15:08:37
             Created: 2025-03-12 15:08:37
       Security_type: DEFINER
             Comment: 
character_set_client: utf8
collation_connection: utf8_general_ci
  Database Collation: latin1_swedish_ci
1 row in set (0.00 sec)

# 跨数据库是否能执⾏:
mysql>  create database testdb;
Query OK, 1 row affected (0.00 sec)

mysql> use testdb;
Database changed
mysql>  call showTime();
ERROR 1305 (42000): PROCEDURE testdb.showTime does not exist

mysql> call test.showTime;
+---------------------+
| now()               |
+---------------------+
| 2025-03-12 15:11:00 |
+---------------------+
1 row in set (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

#  创建含参存储过程:只有⼀个IN参数
mysql> use test;

mysql> delimiter //
mysql>  CREATE PROCEDURE selectById(IN uid SMALLINT UNSIGNED)
    ->  BEGIN
    ->  SELECT * FROM students WHERE stuid = uid;
    ->  END//
Query OK, 0 rows affected (0.00 sec)

mysql> delimiter ;
posted @ 2025-03-12 15:13  basickill  阅读(41)  评论(0)    收藏  举报