iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >Mysql之存储过程和函数
  • 906
分享到

Mysql之存储过程和函数

2024-04-02 19:04:59 906人浏览 安东尼
摘要

Mysql之存储过程和函数存储过程就是一条或多条sql语句的集合,可视为批文件,但是其作用不仅用于批处理。存储程序分为:1、存储过程 2、函数使用Call语句来调用存储过程,只能用输出变量返回值。一、创建存

Mysql之存储过程和函数

存储过程就是一条或多条sql语句的集合,可视为批文件,但是其作用不仅用于批处理。

存储程序分为:1、存储过程 2、函数

使用Call语句来调用存储过程,只能用输出变量返回值。


一、创建存储过程

语法:

create procedure sp_name(proc_parameter)
[characteristics……] routine_body
创建存储函数名为sp_name,存储过程的名为:proc_parameter

指定存储参数列表为:

[IN | OUT | INOUT] param_name type

其中IN表示输入参数,OUT表示输出参数,INOUT表示即可输入也可输出

param_name表示参数名称

type 表示参数类型,该类型可以是Mysql数据库中的任意类型。


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

LANGUAGE SQL:说明routine_body部分是由SQL语句组成,当前系统支持的语言为SQL,SQL是LANGUAGE特性的唯一值。


[NOT] DETERMINISTIC:指明存储过程执行的结果是否正确。

    1. DETERMINISTIC表示结果是正确的。每次执行存储过程时,相同输入会得到相同的输出。

    2. NOT DETERMINISTIC表示结果是不确定的,相同的输入可能得到不同的输出。如果没有指定任意一个值,默认为NOT DETERMINISTIC。


{ CONTaiNS SQL | NO SQL |REDAS SQL DATA | MODIFIES SQL DATA }:指明子程序使用SQL语句的限制。

    1. CONTAINS SQL:表示子程序包含SQL语句,但是不包含读写数据的语句。

    2. NO SQL:表示子程序不包含SQL语句。

    3. REDAS SQL DATA :说明子程序包含数据的语句。

    4. MODIFIES SQL DATA:表明子程序包含写数据的语句。默认为CONTAINS SQL。


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

    1. DEFINER表示只有定义者才能执行。

    2. INVOKER表示拥有权限的调用者可以执行。默认情况下,系统指定为DEFINER


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


routine_body是SQL代码的内容。通常用begin……end表示SQL代码的开始和结束。


编写存储过程并不是简单的事情,可能存储过程中需要复杂的SQL语句,并且要创建存储过程的权限;但是使用存储过程将简化操作,减少冗余的操作步骤,同时,还可以减少操作过程中的失误、提高效率,因此存储过程非常的有用,而且应该尽量学会使用。

例1:

mysql> delimiter //      # 定义SQL语句的结束符号为//,使用这条命令时,应该避免(‘\’)字符,因为反斜线是Mysql的转意符。
mysql> create procedure p1()
  -> begin
  -> select  * from t;
  -> end //
mysql> delimiter ;
mysql> show procedure status \G        # 查看存储过程信息
mysql> call p1    # 读取这个存储过程

例2:

mysql> delimiter //
mysql> create procedure p2(n int)
  -> begin
  -> select * from t where id = n;
  -> end //
mysql> delimiter ;
mysql> show procedure status \G
mysql> call p2(1)         # 需要带入取值

例3:

mysql> create database db_proc;
mysql> use db_proc
mysql> CREATE TABLE `proc_test` (
  -> `id` tinyint(4) NOT NULL AUTO_INCREMENT,
  -> `username` varchar(20) NOT NULL,
  -> `passWord` varchar(20) NOT NULL,
  -> PRIMARY KEY (`id`)
  -> ) ENGINE=MyISAM AUTO_INCREMENT=50 DEFAULT CHARSET=utf8;

mysql> delimiter //
mysql> create procedure mytest(in name varchar(20),in pwd varchar(20))
  -> begin
  -> insert into proc_test(username,password) values(name,pwd);
  -> end //
mysql> delimiter ;
mysql> call mytest('lxq','password') ;
mysql> select * from proc_test;      # 验证插入了数据


************************

mysql存储过程的参数用在存储过程的定义,共有三种参数类型,IN,OUT,INOUT

Create procedure|function([[IN |OUT |INOUT ] 参数名 数据类形...])

IN 输入参数

表示该参数的值必须在调用存储过程时指定,在存储过程中修改该参数的值不能被返回,为默认值

OUT 输出参数

该值可在存储过程内部被改变,并可返回

INOUT 输入输出参数

调用时指定,并且可被改变和返回

IN参数例子:

mysql> DELIMITER //
mysql> CREATE PROCEDURE sp_demo_in_parameter(IN p_in INT)
    -> BEGIN
    -> SELECT p_in;     # 查询输入参数
    -> SET p_in=2;      # 修改
    -> select p_in;     #查看修改后的值
    -> END //
mysql> DELIMITER ;

执行结果:

mysql> set @p_in=1;
mysql> call sp_demo_in_parameter(@p_in);
mysql> select @p_in;
以上可以看出,p_in虽然在存储过程中被修改,但并不影响@p_id的值


OUT参数例子

mysql> DELIMITER //
mysql> CREATE PROCEDURE sp_demo_out_parameter(OUT p_out INT)
    -> BEGIN
    -> SELECT p_out;    # 查看输出参数
    -> SET p_out=2;     # 修改参数值
    -> SELECT p_out;    # 看看有否变化
    -> END //
mysql> DELIMITER ;

执行结果:

mysql> SET @p_out=1;
mysql> CALL sp_demo_out_parameter(@p_out);
mysql> SELECT @p_out;
p_out在存储过程中被修改,直接影响@p_out的值


INOUT参数例子:

mysql> DELIMITER //
mysql> CREATE PROCEDURE sp_demo_inout_parameter(INOUT p_inout INT)
    -> BEGIN
    -> SELECT p_inout;
    -> SET p_inout=2;
    -> SELECT p_inout;
    -> END;
mysql> DELIMITER ;

执行结果:

set @p_inout=1;
call sp_demo_inout_parameter(@p_inout);
select @p_inout;



****************************

二、特定异常

在MySQL中,特定异常需要特定处理。这些异常可以联系到错误,以及子程序中的一般流程控制。定义异常是事先定义程序执行过程中遇到的问题,异常处理定义了在遇到问题时对应当采取的处理方式,并且保证存储过程或者函数在遇到错误时或者警告时能够继续执行。

1 异常定义

1.1 语法

DECLARE condition_name CONDITION FOR [condition_type];

1.2 说明

condition_name 参数表示异常的名称;
condition_type 参数表示条件的类型,condition_type由SQLSTATE [VALUE] sqlstate_value|mysql_error_code组成:
    sqlstate_value和mysql_error_code都可以表示MySQL的错误;
    sqlstate_value为长度为5的字符串类型的错误代码;
    mysql_error_code为数值类型错误代码;


1.3 示例

定义“ERROR 1148(42000)”错误,名称为command_not_allowed。可以有以下两种方法:

# 方法一:使用sqlstate_value
DECLARE command_not_allowed CONDITION FOR SQLSTATE '42000';

# 方法二:使用mysql_error_code
DECLARE command_not_allowed CONDITION FOR 1148;


2 自定义异常处理

2.1 异常处理语法

DECLARE handler_type HANDLER FOR condition_value [,...] sp_statement


2.2 参数说明

handler_type: CONTINUE|EXIT|UNDO
    handler_type为错误处理方式,参数为3个值之一;
    CONTINUE表示遇到错误不处理,继续执行;
    EXIT表示遇到错误时马上退出;
    UNDO表示遇到错误后撤回之前的操作,MySQL暂不支持回滚操作;
    
condition_value: SQLSTATE [VALUE] sqlstate_value| condition_name|SQLWARNING|NOT FOUND|SQLEXCEPTION|mysql_error_code
    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匹配数值类型错误代码;


2.3 异常捕获方法

方法一:捕获sqlstate_value异常
这种方法是捕获sqlstate_value值。如果遇到sqlstate_value值为"42S02",执行CONTINUE操作,并输出"NO_SUCH_TABLE"信息
DECLARE CONTINUE HANDLER FOR SQLSTATE '42S02' SET @info='NO_SUCH_TABLE';

方法二:捕获mysql_error_code异常
这种方法是捕获mysql_error_code值。如果遇到mysql_error_code值为1146,执行CONTINUE操作,并输出"NO_SUCH_TABLE"信息;
DECLARE CONTINUE HANDLER FOR 1146 SET @info='NO_SUCH_TABLE';

方法三:先定义条件,然后捕获异常
DECLARE no_such_table CONDITION FOR 1146;
DECLARE CONTINUE HANDLER FOR NO_SUCH_TABLE SET @info='NO_SUCH_TABLE';

方法四:使用SQLWARNING捕获异常
DECLARE EXIT HANDLER FOR SQLWARNING SET @info='ERROR';

方法五:使用NOT FOUND捕获异常
DECLARE EXIT HANDLER FOR NOT FOUND SET @info='NO_SUCH_TABLE';

方法六:使用SQLEXCEPTION捕获异常
DECLARE EXIT HANDLER FOR SQLEXCEPTION SET @info='ERROR';定义条件和处理程序:
mysql> create table test.t(s1 int,primary key(s1));
mysql> delimiter //
mysql> create procedure handlerdermo()
    -> begin
    -> declare CONTINUE HANDLER FOR SQLSTATE '23000' set @x2 = 1;
    -> set @x = 1;
    -> insert into test.t values (1);
    -> set @x = 2;
    -> insert into test.t values (1);
    -> set @x = 3;
    -> end //
mysql> delimiter ;
mysql> call handlerdermo();
mysql> select @x;
mysql> select * from test.t;

三、函数

函数的作用:提高代码的复用率

函数可以调用函数中的方法来实现某些功能

利用now()来实现空参数函数:

mysql> select now();
+---------------------+
| now()          |
+---------------------+
| 2018-08-16 18:19:09 |
+---------------------+

mysql> select date_fORMat(now(),'%Y年%m月%d号 %H点%i分%s秒');
+------------------------------------------------------+
| date_format(now(),'%Y年%m月%d号 %H点%i分%s秒')       |
+------------------------------------------------------+
| 2018年08月16号 18点19分57秒                          |
+------------------------------------------------------+

------------------------------------------------------------------------------------


mysql> create function my_time() returns varchar(50)
   -> return   date_format(now(),'%Y-%m-%d %H-%i-%s');
Query OK, 0 rows affected (0.00 sec)

mysql> select my_time();
+---------------------+
| my_time()           |
+---------------------+
| 2018-08-16 18-22-10 |
+---------------------+

函数分为空参数函数和传参函数

注意:函数必需要有返回值类型用returns描述

returns后面跟的是函数体

如果函数体只有单条就直接描述

函数体如果有多条 在returns后面 begin开始  函数体结束后要写end结束

end之前一定要确定返回值

-----------------------------------------------------------------------------------------------

创建传参函数:

mysql> CREATE FUNCTION cont_AVG(num1 int,num2 int) RETURNS decimal(8,2)
    -> RETURN (num1+num2)/2;
Query OK, 0 rows affected (0.00 sec)

mysql> select cont_AVG(2,2);
+---------------+
| cont_AVG(2,2) |
+---------------+
|    2.00     |
+---------------+
1 row in set (0.00 sec)

mysql> select cont_AVG(3,2);
+---------------+
| cont_AVG(3,2) |
+---------------+
|     2.50     |
+---------------+


创建给stu表添加用户的多函数体传参函数:

mysql> desc stu;
+-------+-------------+------+-----+---------+-------+
| Field | Type      | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id   | int(11)    | NO   |    | NULL   |     |
| name  | varchar(10) | NO   |    | NULL   |     |
+-------+-------------+------+-----+---------+-------+
mysql> select * from stu;
Empty set (0.00 sec)



mysql> delimiter //
mysql> create function adduse(u_id int unsigned,u_name varchar(10))
    -> returns int unsigned
    -> begin
    -> insert stu values(u_id,u_name);
    -> return last_insert_id();
    -> end //
mysql> delimiter ;
mysql> select adduse(1,'zs');
+----------------+
| adduse(1,'zs') |
+----------------+
|      0      |
+----------------+
1 row in set (0.02 sec)

mysql> select adduse(2,'ls');
+----------------+
| adduse(2,'ls') |
+----------------+
|      0      |
+----------------+
1 row in set (0.01 sec)

mysql> select adduse(3,'ww');
+----------------+
| adduse(3,'ww') |
+----------------+
|      0      |
+----------------+
1 row in set (0.02 sec)

mysql> select * from stu;
+----+------+
| id | name |
+----+------+
| 1  | zs   |
| 2  | ls   |
| 3  | ww   |
+----+------+
3 rows in set (0.00 sec)


您可能感兴趣的文档:

--结束END--

本文标题: Mysql之存储过程和函数

本文链接: https://www.lsjlt.com/news/41052.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 浅谈MYSQL存储过程和存储函数
    目录1. 什么是存储过程和存储函数?2. 创建存储过程3. 创建存储函数4. 存储过程和存储函数的使用5. 带有if语句的存储过程6. 带有循环语句的存储过程7. 带有事务的存储过程8. 带有游标的存储函数9. 存储过程...
    99+
    2023-05-05
    MYSQL存储过程 MYSQL 存储函数
  • 细谈Mysql的存储过程和存储函数
    1 存储过程 1.1 什么是存储过程 存储过程是一组为了完成某项特定功能的sql语句集,其实质上就是一段存储在数据库中的代码,他可以由声明式的sql语句(如CREATE,UPDATE,SELECT等语句...
    99+
    2024-04-02
  • MySQL之存储过程和函数的示例分析
    这篇文章将为大家详细讲解有关MySQL之存储过程和函数的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、变量系统变量系统变量分为全局变量和会话变量,是由系统提供...
    99+
    2024-04-02
  • mysql存储过程和存储函数有哪些区别
    本文小编为大家详细介绍“mysql存储过程和存储函数有哪些区别”,内容详细,步骤清晰,细节处理妥当,希望这篇“mysql存储过程和存储函数有哪些区别”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起...
    99+
    2024-04-02
  • mysql存储过程和函数的区别
    存储过程与函数的区别:存储过程可返回多个值或结果集,而函数仅返回单个标量值。存储过程通常在事务中执行,而函数可独立执行。存储过程具有副作用,而函数通常没有。存储过程可重用,但函数通常比存...
    99+
    2024-04-22
    mysql
  • MySQL之存储过程
    我的小站:我的博客 1.1 存储过程简介 存储过程是一组为了完成特定功能的SQL语句集合,经编译后存储在数据库中。用户通过指定存储过程的名字并给出参数的值 MySQL 5.0 版本开始支持存储过程。 存储过程(Stored Procedur...
    99+
    2023-09-02
    数据库 mysql sql
  • MySQL中存储过程和存储函数的示例分析
    这篇文章主要为大家展示了“MySQL中存储过程和存储函数的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“MySQL中存储过程和存储函数的示例分析”这篇文...
    99+
    2024-04-02
  • MYSQL中存储过程和函数怎么写
    这篇文章将为大家详细讲解有关MYSQL中存储过程和函数怎么写,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。什么是存储过程简单的说,就是一组SQL语句集,功能强大,可以实现...
    99+
    2024-04-02
  • mysql中存储过程和存储函数指的是什么
    小编给大家分享一下mysql中存储过程和存储函数指的是什么,希望大家阅读完这篇文章后大所收获,下面让我们一起去探讨吧!在mysql中,存储过程和存储函数都是数据库中定义的一些SQL语句的集合。其中,存储函数...
    99+
    2024-04-02
  • MySQL 视图、函数和存储过程详解
    目录一、视图二、函数三、存储过程MySQL 是一种流行的关系型数据库管理系统,其具有强大的功能和灵活性,使其成为了许多企业和个人喜爱的数据库选择。在 MySQL 中,视图、函数和存储...
    99+
    2023-05-18
    MySQL 视图 函数和存储过程 MySQL 函数和存储过程
  • MySQL 视图、函数和存储过程详解
    目录一、视图二、函数三、存储过程mysql 是一种流行的关系型数据库管理系统,其具有强大的功能和灵活性,使其成为了许多企业和个人喜爱的数据库选择。在 MySQL 中,视图、函数和存储过程是常见的数据库对象,它们都有助于提...
    99+
    2023-04-26
    MySQL 视图 函数和存储过程 MySQL 函数和存储过程
  • MySQL存储过程和函数怎么创建
    这篇文章主要介绍“MySQL存储过程和函数怎么创建”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“MySQL存储过程和函数怎么创建”文章能帮助大家解决问题。1.0  创建存储过程和函数创建存...
    99+
    2023-06-30
  • 彻底搞懂MySQL存储过程和函数
    目录1.0  创建存储过程和函数1. 创建存储过程2. 创建存储函数2|0变量1. 定义变量2. 变量赋值3|0定义条件和处理程序1. 定义条件2. 定义处理程序4|0光标...
    99+
    2024-04-02
  • MySQL系列之五 视图、存储函数、存储过程、触发器
    目录系列教程一、视图 1、视图的创建 2、查看视图定义 3、删除视图 二、存储函数 1、系统函数 2、自定义函数(user-defined function:UDF) 三、存储过程 ...
    99+
    2024-04-02
  • 关于MySQL的存储过程与存储函数
    目录初识存储过程存储过程语法存储过程调用存储函数的使用语法函数的调用对比存储函数和存储过程初识存储过程 理解:含义: 存储过程(Stored Procedure)是在大型数据库系统中...
    99+
    2023-05-19
    MySQL存储过程 MySQL存储函数
  • mysql存储过程和函数有什么区别
    存储过程和函数的区别:用途:存储过程用于复杂操作,函数用于单次计算。语法:存储过程使用 create procedure 创建,函数使用 create function 创建。输入输出:...
    99+
    2024-04-22
    mysql
  • mysql存储过程与存储函数实例分析
    这篇文章主要介绍了mysql存储过程与存储函数实例分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇mysql存储过程与存储函数实例分析文章都会有所收获,下面我们一起来看看吧。...
    99+
    2022-11-30
    mysql
  • 如何在MySQL中使用存储过程和函数?
    如何在MySQL中使用存储过程和函数?在MySQL中,存储过程和函数是被封装的一组SQL语句,可以被重复调用。存储过程是一组可以在服务器上执行的SQL语句集合,而函数则是一个独立的且可重用的代码块。两者的不同之处在于,存储过程可以返回多个结...
    99+
    2023-10-22
    函数 MySQL 存储过程
  • 初探Oracle存储过程和函数的不同之处
    初探Oracle存储过程和函数的不同之处 在Oracle数据库中,存储过程(Stored Procedure)和函数(Function)是数据库中常见的两种可重复利用的代码块。虽然它们...
    99+
    2024-03-03
    函数 oracle 存储过程 sql语句
  • mysql存储过程与函数的写法
    本篇内容介绍了“mysql存储过程与函数的写法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! 存...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作