目录
1.0  创建存储过程和函数
1. 创建存储过程
2. 创建存储函数
2|0变量
1. 定义变量
2. 变量赋值
3|0定义条件和处理程序
1. 定义条件
2. 定义处理程序
4|0光标
1. 声明光标
2. 打开光标
3. 使用光标
4. 关闭光标
5|0流程控制
1. IF 语句
2. CASE 语句
3. LOOP 语句
4. LEAVE 语句
5. ITERATE 语句
6. REPEAT 语句
7. WHILE 语句
6|0操作存储过程和函数
1. 调用存储过程
2. 调用存储函数
3. 使用 SHOW STATUS 语句查看存储过程和函数的状态
4. 使用 SHOW CREATE 语句查看存储过程和函数的定义
5. 从 information_schema.Routine 表中查看存储过程和函数的信息
6. 修改存储过程和函数
7. 删除存储过程和函数
首页 数据库 mysql教程 MySQL存储过程和函数怎么创建

MySQL存储过程和函数怎么创建

Jun 03, 2023 am 09:22 AM
mysql

1.0  创建存储过程和函数

创建存储过程和函数就是将经常使用的一组 SQL 语句组合在一起,并将这些 SQL 语句当作一个整体存储在 MySQL 服务器

1. 创建存储过程

CREATE PROCEDURE procedure_name ([proc_param[,...]])
    [characteristic ...] routine_body
登录后复制
  • procedure_name 表示所要创建的存储过程的名字

  • proc_param 表示存储过程的参数

  • characteristic 表示存储过程的特性

  • routine_body 表示存储过程的 SQL 语句

procedure_name 不能出现重名

proc_param 中每个参数的语法形式如下,每个参数由三部分组成,分别为输入/输出类型、参数名和参数类型。共有三种输入输出类型,分别是IN、OUT、INOUT。param_name 表示参数名,type 表示参数类型

[ IN | OUT | INOUT ] param_name type
登录后复制

characteristic 指定存储过程的特性,有以下取值:

  • LANGUAGE SQL:说明存储过程中使用的是 SQL 语言编写的

  • [NOT] DETERMINISTIC:说明存储过程执行的结果是否正确,DETERMINISTIC 表示结果是确定的,即每次执行存储过程,相同的输入会得到相同的输出;NOT DETERMINISTIC 表示结果是不确定的,相同的输入可能得到不同的输出,默认为 NOT DETERMINISTIC

  • {CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA}:指明子程序使用 SQL 语句的限制,CONTAINS SQL 表示子程序不包含读或者写数据的语句,NO SQL 表示子程序不包含 SQL,READS SQL DATA 表示子程序包含读数据的语句,但是不包含写数据的语句,MODIFIES SQL DATA 表示子程序包含写数据的语句

  • SQL SECURITY {DEFINER | INVOKER}:指明谁有权限执行,DEFINER 表示只有定义者才能执行,INVOKER 表示拥有权限的调用者可以执行,默认为 DEFINER

  • COMMENT 'string':注释信息,可以用来描述存储过程或函数

示例:创建存储过程,查询表 t_employee 中所有员工的薪水的存储过程

DELIMITER $$
CREATE PROCEDURE proc_employee()
COMMENT '查询员工薪水'
BEGIN
	SELECT salary FROM t_employee
END;
$$
DELIMITER ;
登录后复制

MySQL 中默认以分号 ; 作为语句结束符,存储过程中的 SQL 语句需要分号来结束,为了避免冲突,先用 DELIMITER $$ 将 MySQL 的结束符设置为 $$,再用 DELIMITER ; 将结束符恢复为分号

2. 创建存储函数

CREATE FUNCTION fun_name([func_param,[,...]])
	[characteristic ...] routine_body
登录后复制
  • fun_name 表示函数名字

  • func_param 表示函数从参数

  • characteristic 表示函数特性,取值与存储过程的取值相同

  • routine_body 表示函数的 SQL 语句

func_param 中每个参数的语法形式如下,分别为参数名和参数类型

param_type type

还是之前的示例

DELIMITER $$
	CREATE FUNCTION func_employee(id INT(4))
		RETURNS INT(6)
	COMMENT '查询员工薪水'
	BEGIN
		SELECT salary FROM t_employee
	END;
	$$
DELIMITER ;
登录后复制

2|0变量

在 MySQL 中,可以定义和使用变量,这些变量的作用范围在 BEGIN ... END 程序段中

1. 定义变量

DECLARE var_name[,...] type [DEFAULT value]
登录后复制
  • 关键字 DECLARE 用来声明变量

  • 参数 var_name 是变量的名称,可以同时定义多个变量

  • 参数 type 用来指定变量的类型

  • DEFAULT value 子句将变量默认值设置为 value,没有使用 DEFAULT 子句时,默认值为 NULL

示例:定义变量 sql_test,数据类型为 INT 型,默认值为 10

DECLARE test_sql INT DEFAULT 10;
登录后复制

2. 变量赋值

SET var_name=expr[,var_name=expr]...
登录后复制
  • 关键字 SET 用来为变量赋值

  • 参数 var_name 是变量的名称

  • 参数 expr 是赋值表达式

示例:将变量 sql_test 赋值为 30

SET test_sql = 30;
登录后复制

3|0定义条件和处理程序

定义条件和处理程序是事先定义程序执行过程中可能遇到的问题,并且可以在处理程序中定义解决这些问题的能力

1. 定义条件

DECLARE condition_name CONDITION FOR condition_value
condition_value:
SQLSTATE[VALUE] sqlstate_value|mysql_error_code
登录后复制
  • 参数 condition_name 表示条件名称

  • 参数 condition_value 表示条件类型

  • 参数 sqlstate_value 和 参数 mysql_error_code 都可以表示 MySQL 的错误

示例:定义 ERROR 1146(42S02) 错误,名称为 can_not_find,可以用两种不同的方法来定义

// 方法一:使用sqlstate_value
DECLARE can_not_find CONDITION FOR SQLSTATE '42S02';
// 方法二:使用mysql_error_code
DECLARE can_not_find CONDITION FOR 1146;
登录后复制

2. 定义处理程序

DECLARE handler_type HANDLER FOR condition_value[,...] proc_statement
handler_type:
CONTINUE|EXIT|UNDO
condition_value:
SQLSTATE[VALUE]sqlstate_value|condition_name|SQLWARNING|NOT FOUND|SQLEXCEPTION|mysql_error_code
登录后复制
  • handler_type 指明错误的处理方式:该参数有三个取值:

    • CONTINUE:表示遇到错误不处理,继续向下执行

    • EXIT:表示遇到错误马上退出

    • UNDO:表示遇到错误后撤回之前的操作

  • condition_value 表示错误类型,可以有以下取值:

    • SQLSTATE[VALUE]sqlstate_value 包含 5 个字符的字符串错误值

    • condition_name 表示 DECLARE CONDITION 定义的错误条件名称

    • SQLWARNING 匹配所有 01 开头的 SQLSTATE 错误代码

    • NOT FOUND 匹配所有 02 开头的 SQLSTATE 错误代码

    • SQLEXCEPTION 匹配所有没有被 SQLWARNING 或 NOT FOUND 捕获的 SQLSTATE 错误代码

    • mysql_error_code 匹配数值类型错误代码

  • proc_statement 匹配数值类型错误代码

下面是定义处理程序的几种示例方式:

// 方法一:捕获sqlstate_value
DECLARE CONTINUE HANDLER FOR SQLSTATE '42S02'
SET @info='NOT FOUND';
// 方法二:使用mysql_error_code 
DECLARE CONTINUE HANDLER FOR 1146
SET @info='NOT FOUND';
// 方法三:先定义条件,然后调用
ECLARE can_not_find CONDITION FOR 1146;
DECLARE CONTINUE HANDLER FOR can_not_find
SET @info='NOT FOUND';
// 方法四:使用SQLWARNING
DECLARE EXIT HANDLER FOR SQLWARNING 
SET @info='ERROR';
// 方法五:使用NOT FOUND
DECLARE EXIT HANDLER FOR NOT FOUND
SET @info='NOT FOUND';
// 方法六:使用SQLEXCEPTION 
DECLARE EXIT HANDLER FOR 使用SQLEXCEPTION
SET @info='ERROR';
登录后复制

4|0光标

在存储过程和函数中,可以使用光标逐条读取查询结果集中可能出现的多条记录。光标必须声明在处理程序之前,声明在变量和条件之后

1. 声明光标

DECLARE cursor_name CURSOR
FOR select_statement;
登录后复制
  • 参数 cursor_name 表示光标名称

  • 参数 select_statement 表示 SELECT 语句

下面声明一个名为 cur_employee 的光标

DECLARE cur_employee CURSOR
FOR SELECT name,age FROM t_employee;
登录后复制

2. 打开光标

OPEN cursor_name;
登录后复制
  • 参数 cursor_name 表示光标的名称

下面打开一个名为 cur_employee 的光标

OPEN cur_employee;
登录后复制

3. 使用光标

FETCH cursor_name
INTO var_name[,var_name...]
登录后复制
  • cursor_name 表示光标的名称

  • var_name 表示将光标中的 SELECT 语句查询出来的信息存入该参数,该参数必须在声明光标之前就定义好

下面打开一个名为 cur_employee 的光标,将查询的数据存入 emp_name 和 emp_age 这两个变量中

FETCH cur_employee INTO emp_name,emp_age;
登录后复制

4. 关闭光标

CLOSE cursor_name
登录后复制
  • cursor_name 表示光标的名称

5|0流程控制

1. IF 语句

IF search_condition THEN statement_list
 [ELSEIF search_condition THEN statement_list]...
 [ELSE statement_list]
END IF
登录后复制
  • 参数 search_condition 表示条件判断语句

  • 参数 statement_list 表示不同条件的执行语句

下面是一个 IF 语句的示例

IF age>20 THEN SET @count1=@conut1+1;
	ELSEIF age=20 THEN @count2=@conut2+1;
	ELSE @count3=@count3+1;
END IF;
登录后复制

2. CASE 语句

CASE case_value
	WHEN when_value THEN statement_list
	[WHEN when_value THEN statement_list]...
	[ELSE statement_list]
END CASE
登录后复制
  • 参数 case_value 表示条件判断的变量

  • 参数 when_value 表示变量的取值

  • 参数 statement_list 表示不同 when_value 的执行语句

下面的是一个 CASE 语句的示例

CASE age
	WHEN 20 THEN SET @count1=@count1+1;
	ELSE SET @count2=@count2+1;
END CASE;
登录后复制

3. LOOP 语句

[begin_label:]LOOP
	statement_list
END LOOP [end_label]
登录后复制
  • 参数 begin_label 和参数 end_label 分别表示循环开始和结束的标志,必须相同,而且都可以省略

  • 参数 statement_list 表示需要循环执行的语句

下面是一个 LOOP 语句的示例

add_num:LOOP
	SELECT @count1=@count1+1;
END LOOP add_num
登录后复制

4. LEAVE 语句

主要用于跳出循环

LEAVE label
登录后复制
  • 参数 label 表示循环的标志

下面是一个 LEAVE 语句的示例

add_num:LOOP
	SELECT @count1=@count1+1;
	IF @count1=100 THEN
		LEAVE add_num;
END LOOP add_num
登录后复制

5. ITERATE 语句

也是用于跳出循环,不过是跳出本次循环,直接进入下次循环,类似 Java 的 continue

ITERATE label
登录后复制

ITERATE label

  • 参数 label 表示循环的标志

下面是一个 ITERATE 语句的示例

add_num:LOOP
	SELECT @count1=@count1+1;
	IF @count1=100 THEN
		LEAVE add_num;
	ELSE IF MOD(@count1,3)=0 THEN
		ITERATE add_num;
	SELECT * FROM employee;
END LOOP add_num
登录后复制

6. REPEAT 语句

REPEAT 语句是由条件的控制循环语句,当满足特定条件就会退出循环语句

[begin_label:]REPEAT
	statement_list
	UNTIL search_condition
END REPEAT [end_label]
登录后复制
  • 参数 statement_list 表示需要循环执行的语句

  • 参数 search_condition 表示结束循环的条件,满足该条件即结束循环

下面是一个 REPEAT 语句的示例

add_num:REPEAT
	SELECT @count1=@count1+1;
	UNTIL @count1=100
END REPEAT add_num
登录后复制

7. WHILE 语句

WHILE 语句也是有条件控制的循环语句,与 REPEAT 语句不同的是,WHILE 语句是当满足条件时执行循环内的语句

[begin_label:]WHILE search_condition DO
	statement_list
END WHILE [end_label]
登录后复制
  • 参数 statement_list 表示需要循环执行的语句

  • 参数 search_condition 表示结束循环的条件,满足该条件即结束循环

下面是一个 WHILE 语句的示例

WHILE @count<100 DO
	SET @count=@count+1;
END WHILE;
登录后复制

6|0操作存储过程和函数

1. 调用存储过程

在 MySQL 中,使用 CALL 语句来调用存储过程

CALL proc_name([parameter[,...]])
登录后复制
  • proc_name 是存储过程的名称

  • paramter 是指存储过程的参数

2. 调用存储函数

在 MySQL 中,存储函数的使用方法和 MySQL 内部函数是一样的

3. 使用 SHOW STATUS 语句查看存储过程和函数的状态

SHOW {PROCEDURE|FUNCTION} STATUS{LIKE &#39;pattern&#39;}
登录后复制
  • 参数 PROCEDURE 表示查询存储过程,FUNCTION 表示存储函数

  • 参数 LIKE 'pattern' 用来匹配存储过程或函数的名称

4. 使用 SHOW CREATE 语句查看存储过程和函数的定义

SHOW CREATE {PROCEDURE|FUNCTION} proc_name
登录后复制

5. 从 information_schema.Routine 表中查看存储过程和函数的信息

SELECT * FROM information_schema.Routine
WHERE ROUTINE_NAME=&#39;proc_name&#39;
登录后复制

6. 修改存储过程和函数

ALTER {PROCEDURE|FUNCTION} proc_name[characteristic...];
characteristic:
	{CONTAINS SQL|NO SQL|READS SQL DATA|MODIFIES SQL DATA}
|SQL SECURITY{DEFINER|INVOKER}
|COMMENT &#39;string&#39;
登录后复制
  • 参数 proc_name 表示存储过程或函数的名称

  • 参数 characteristic 指定存储过程的特性:

    • CONTAINS SQL 表示子程序包含 SQL 语句,但不包含读或写数据的语句

    • NO SQL 表示子程序不包含 SQL 语句

    • READS SQL DATA 表示子程序中包含读数据的语句

    • MODIFIES SQL DATA 表示子程序中包含写数据的语句

  • SQL SECURITY{DEFINER|INVOKER} 指明谁有权限执行:

    • DEFINER 表示只有定义者才能执行

    • INVOKER 表示调用者可以执行

  • COMMENT 'string' 是注释信息

7. 删除存储过程和函数

通过 DROP 语句删除存储过程

DROP PROCEDURE proc_name;
登录后复制

通过 DROP FUNCTION 语句删除存储函数

DROP FUNCTION func_name;
登录后复制

以上是MySQL存储过程和函数怎么创建的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

<🎜>:泡泡胶模拟器无穷大 - 如何获取和使用皇家钥匙
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系统,解释
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆树的耳语 - 如何解锁抓钩
3 周前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

热门话题

Java教程
1669
14
CakePHP 教程
1428
52
Laravel 教程
1329
25
PHP教程
1273
29
C# 教程
1256
24
laravel入门实例 laravel入门实例 Apr 18, 2025 pm 12:45 PM

Laravel 是一款 PHP 框架,用于轻松构建 Web 应用程序。它提供一系列强大的功能,包括:安装: 使用 Composer 全局安装 Laravel CLI,并在项目目录中创建应用程序。路由: 在 routes/web.php 中定义 URL 和处理函数之间的关系。视图: 在 resources/views 中创建视图以呈现应用程序的界面。数据库集成: 提供与 MySQL 等数据库的开箱即用集成,并使用迁移来创建和修改表。模型和控制器: 模型表示数据库实体,控制器处理 HTTP 请求。

MySQL和PhpMyAdmin:核心功能和功能 MySQL和PhpMyAdmin:核心功能和功能 Apr 22, 2025 am 12:12 AM

MySQL和phpMyAdmin是强大的数据库管理工具。1)MySQL用于创建数据库和表、执行DML和SQL查询。2)phpMyAdmin提供直观界面进行数据库管理、表结构管理、数据操作和用户权限管理。

MySQL与其他编程语言:一种比较 MySQL与其他编程语言:一种比较 Apr 19, 2025 am 12:22 AM

MySQL与其他编程语言相比,主要用于存储和管理数据,而其他语言如Python、Java、C 则用于逻辑处理和应用开发。 MySQL以其高性能、可扩展性和跨平台支持着称,适合数据管理需求,而其他语言在各自领域如数据分析、企业应用和系统编程中各有优势。

laravel框架安装方法 laravel框架安装方法 Apr 18, 2025 pm 12:54 PM

文章摘要:本文提供了详细分步说明,指导读者如何轻松安装 Laravel 框架。Laravel 是一个功能强大的 PHP 框架,它 упростил 和加快了 web 应用程序的开发过程。本教程涵盖了从系统要求到配置数据库和设置路由等各个方面的安装过程。通过遵循这些步骤,读者可以快速高效地为他们的 Laravel 项目打下坚实的基础。

在MySQL中解释外键的目的。 在MySQL中解释外键的目的。 Apr 25, 2025 am 12:17 AM

在MySQL中,外键的作用是建立表与表之间的关系,确保数据的一致性和完整性。外键通过引用完整性检查和级联操作维护数据的有效性,使用时需注意性能优化和避免常见错误。

比较和对比Mysql和Mariadb。 比较和对比Mysql和Mariadb。 Apr 26, 2025 am 12:08 AM

MySQL和MariaDB的主要区别在于性能、功能和许可证:1.MySQL由Oracle开发,MariaDB是其分支。2.MariaDB在高负载环境中性能可能更好。3.MariaDB提供了更多的存储引擎和功能。4.MySQL采用双重许可证,MariaDB完全开源。选择时应考虑现有基础设施、性能需求、功能需求和许可证成本。

SQL与MySQL:澄清两者之间的关系 SQL与MySQL:澄清两者之间的关系 Apr 24, 2025 am 12:02 AM

SQL是一种用于管理关系数据库的标准语言,而MySQL是一个使用SQL的数据库管理系统。SQL定义了与数据库交互的方式,包括CRUD操作,而MySQL实现了SQL标准并提供了额外的功能,如存储过程和触发器。

yi框架用什么软件比较好 yi框架使用软件推荐 yi框架用什么软件比较好 yi框架使用软件推荐 Apr 18, 2025 pm 11:03 PM

文章首段摘要:在选择开发 Yi 框架应用程序的软件时,需要考虑多个因素。虽然原生移动应用程序开发工具(如 XCode 和 Android Studio)可以提供强大的控制和灵活性,但跨平台框架(如 React Native 和 Flutter)凭借其编写一次,即可部署到多个平台的优点而越来越受欢迎。对于刚接触移动开发的开发者,低代码或无代码平台(如 AppSheet 和 Glide)可以快速轻松地构建应用程序。另外,云服务提供商(如 AWS Amplify 和 Firebase)提供了全面的工具

See all articles