MySQL 存储过程和函数

目录

一、存储过程和函数概述

二、创建存储过程和函数

1、创建存储过程

2、创建存储函数

三、查看/调用储存过程和函数

1、查看储存过程/函数

2、调用储存过程/函数

四、修改/删除存储过程和函数

1、修改存储过程和函数

2、删除存储过程和函数

五、练习


一、存储过程和函数概述

存储过程就是一条或多条SQL语句的集合,可视为批文件,但是七作用不仅限于批处理。创建存储过程和函数的语句分别是create proceddure 和 create function。使用CALL语句来调用存储过程,只能输出变量返回值。函数可以从语句外调用(即通过引用函数名),也能返回标量值。存储过程也可以调用其他存储过程。

二、创建存储过程和函数

1、创建存储过程

语法

sql 复制代码
create procedure 存储过程名称 ([定义存储过程参数列表]) 
begin
body
end 结束符

储存过程参数列表:

in \| out \| inout\] 参数名 参数类型 in---输入参数 out---输出参数 inout---输入输出参数 例如 ```sql mysql> delimiter // mysql> create procedure avg_age() -> begin -> select avg(age) as ave_age -> from emp3; -> end // Query OK, 0 rows affected (0.00 sec) mysql> delimiter ; ``` delimiter //语句的作用是将MySQL的结束符设置为//。MySQL默认的结束符是";" 。避免冲突。 ### **2、创建存储函数** 语法 ```sql create function 存储函数名 ([定义存储过程参数列表]) returns 类型 begin body; end 结束符 ``` 例如 ```sql mysql> delimiter // mysql> create function count_num() -> returns int -> return (select count(*) from emp3); -> // Query OK, 0 rows affected (0.03 sec) mysql> delimiter ; ``` ## **三、查看/调用储存过程和函数** ### **1、查看储存过程/函数** 基本语法1 ```sql show [procedure | function] status [like '存储过程名|函数名' \G ``` 基本语法2 ```sql show create [procedure | function] 存储过程名|函数名 \G ``` 基本语法3 ```sql select * from information_schema.Routines where ROUTINE_NAME='存储过程名 | 函数名' \G ``` 例如 基本语法1 ```sql mysql> show procedure status like 'avg_age' \G *************************** 1. row *************************** Db: mydb3 Name: avg_age Type: PROCEDURE Definer: root@localhost Modified: 2023-08-22 16:22:41 Created: 2023-08-22 16:22:41 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) ``` 基本语法2 ```sql mysql> show create procedure avg_age \G *************************** 1. row *************************** Procedure: avg_age sql_mode: ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION Create Procedure: CREATE DEFINER=`root`@`localhost` PROCEDURE `avg_age`() begin select avg(age) as ave_age from emp3; end character_set_client: utf8 collation_connection: utf8_general_ci Database Collation: latin1_swedish_ci 1 row in set (0.00 sec) ``` 基本语法3 ```sql mysql> select * from information_schema.Routines where ROUTINE_NAME='avg_age' \G *************************** 1. row *************************** SPECIFIC_NAME: avg_age ROUTINE_CATALOG: def ROUTINE_SCHEMA: mydb3 ROUTINE_NAME: avg_age ROUTINE_TYPE: PROCEDURE DATA_TYPE: CHARACTER_MAXIMUM_LENGTH: NULL CHARACTER_OCTET_LENGTH: NULL NUMERIC_PRECISION: NULL NUMERIC_SCALE: NULL DATETIME_PRECISION: NULL CHARACTER_SET_NAME: NULL COLLATION_NAME: NULL DTD_IDENTIFIER: NULL ROUTINE_BODY: SQL ROUTINE_DEFINITION: begin select avg(age) as ave_age from emp3; end EXTERNAL_NAME: NULL EXTERNAL_LANGUAGE: NULL PARAMETER_STYLE: SQL IS_DETERMINISTIC: NO SQL_DATA_ACCESS: CONTAINS SQL SQL_PATH: NULL SECURITY_TYPE: DEFINER CREATED: 2023-08-22 16:22:41 LAST_ALTERED: 2023-08-22 16:22:41 SQL_MODE: ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION ROUTINE_COMMENT: DEFINER: root@localhost CHARACTER_SET_CLIENT: utf8 COLLATION_CONNECTION: utf8_general_ci DATABASE_COLLATION: latin1_swedish_ci 1 row in set (0.01 sec) ``` ### **2、调用储存过程/函数** 基本语法 ```sql call 存储过程名 (参数); select 函数名([参数]); ``` 例如 ```sql mysql> call avg_age; +---------+ | ave_age | +---------+ | 43.9000 | +---------+ 1 row in set (0.00 sec) ``` ## **四、修改/删除存储过程和函数** ### **1、修改存储过程和函数** 基本语法 ```sql alter procedure | function 存储过程名 | 函数名 [参数] ``` 例如 ### **2、删除存储过程和函数** 基本语法 ```sql drop [procedure | function] [if exists] 存储过程名|函数名 ``` ## **五、练习** 创建表sch并插入数据 |-------|-------------|----|----|----|----|----| | 字段名 | 数据类型 | 主键 | 外键 | 非空 | 唯一 | 自增 | | id | INT | 是 | 否 | 是 | 是 | 否 | | name | VARCHAR(50) | 否 | 否 | 是 | 否 | 否 | | glass | VARCHAR(50) | 否 | 否 | 是 | 否 | 否 | sch 表内容 |----|------|--------| | id | name | glass | | 1 | 小明 | Glass1 | | 2 | 小军 | Glass2 | ```sql create table sch ( id int primary key, name varchar(50) not null, glass varchar(50) not null )charset=utf8; insert into sch values (1,'小明','Glass1'), (2,'小军','Glass2') ; mysql> select * from sch; +----+--------+--------+ | id | name | glass | +----+--------+--------+ | 1 | 小明 | Glass1 | | 2 | 小军 | Glass2 | +----+--------+--------+ 2 rows in set (0.00 sec) ``` 1、创建一个可以统计表格内记录条数的存储函数 ,函数名为count_sch(); ```sql mysql> delimiter $$ mysql> create function count_sch() -> returns int -> begin -> return (select count(id) from sch) -> ; -> end$$ mysql> delimiter ; mysql> select count_sch(); +-------------+ | count_sch() | +-------------+ | 2 | +-------------+ 1 row in set (0.00 sec) ``` 2、创建一个存储过程record,有1个参数,输入id,功能是输入id输出对应完整信息。 ```sql mysql> delimiter $$ mysql> create procedure record (in id_1 int) begin select * from sch where id=id_1; end$$ Query OK, 0 rows affected (0.00 sec) mysql> delimiter ; mysql> call record(1); +----+---------+--------+ | id | name | glass | +----+---------+--------+ | 1 | 小明 | glass1 | +----+---------+--------+ 1 row in set (0.00 sec) ```

相关推荐
一个天蝎座 白勺 程序猿36 分钟前
Apache IoTDB(10):数据库操作——从查询到优化的全链路实践指南
数据库·apache·时序数据库·iotdb
q***577443 分钟前
MySQL 实验1:Windows 环境下 MySQL5.5 安装与配置
windows·mysql·adb
普普通通的南瓜1 小时前
IP证书在关键信息基础设施安全防护中的实践与挑战
网络·数据库·网络协议·tcp/ip·安全·ssl
合作小小程序员小小店1 小时前
桌面开发,超市管理系统开发,基于C#,winform,sql server数据库
开发语言·数据库·sql·microsoft·sqlserver·c#
quweiie1 小时前
thinkphp8.0链接SQL SERVER2022数据库
数据库·sqlserver·thinkphp
8***84822 小时前
如何在Linux中找到MySQL的安装目录
linux·运维·mysql
Databend2 小时前
如何打造AI时代的数据基石 | Databend Meetup 上海站
数据库
W***83202 小时前
如何在 Ubuntu 22.04 上安装 MySQL
linux·mysql·ubuntu
老华带你飞2 小时前
海产品销售系统|海鲜商城购物|基于SprinBoot+vue的海鲜商城系统(源码+数据库+文档)
java·前端·数据库·vue.js·论文·毕设·海鲜商城购物系统
合作小小程序员小小店3 小时前
桌面开发,在线%超市销售管理%系统,基于vs2022,c#,winform,sql server数据
开发语言·数据库·microsoft·c#