MariaDB 存储过程与函数(10)
简单的说,存储过程就是一条或者多条SQL语句的集合,可以理解为脚本,但是起作用不仅限于批处理,下面我们将重点学习如何使用创建存储函数和过程,变量的调用查看等,存储过程是MySQL的一个重点内容.
存储程序可以分为存储过程和函数,MySQL中创建存储过程和函数使用的语句分别是:CREATE PROCEDURE和CREATE FUNCTION.使用CALL语句来调用存储过程,只能用输出变量返回值.函数可以从语句外调用(即通过引用函数名),也能返回标量值,存储过程也可以调用其他存储过程.
创建存储过程
创建存储过程,需要使用create procedure语句,其基本语法格式如下:
create procedure proc_name ([proc_parameter])
	[characteristics ...] routine_body
如上,create procedure为用来创建存储函数的关键字,proc_name为存储过程名称,proc_parameter为指定存储过程的参数列表,列表的形式如下所示:
[ IN | OUT | INOUT ] param_name type
其中,IN表示输入的参数,OUT表示输出的参数,INOUT表示即可以输入也可以输出,param_name表示参数名称,type表示参数的类型,该类型可以使MySQL数据库中任意的类型.
创建简单存储过程: 创建一个存储过程Proc(),实现查询lyshark数据表的所有字段.
MariaDB [lyshark]> delimiter //
MariaDB [lyshark]> create procedure Proc()
    -> BEGIN
    -> select * from lyshark;
    -> END //
Query OK, 0 rows affected (0.00 sec)
MariaDB [lyshark]> delimiter ;
MariaDB [lyshark]> call Proc;
以上存储过程,只是执行了查询语句的操作,delimiter语句的作用是方式结束符与冒号相冲突,当我们写完存储过程时,应该使用相同的闭合语句恢复.
创建带参存储过程: 创建一个存储过程,查询lyshark表中记录,过程名称为CountProc,并使用count(*)计算后把结果放入参数param1中,SQL语句如下:
MariaDB [lyshark]> delimiter //
MariaDB [lyshark]> create procedure CountProc(OUT param1 INT)
    -> BEGIN
    -> select count(*) into param1 from lyshark;
    -> END //
Query OK, 0 rows affected (0.01 sec)
MariaDB [lyshark]> delimiter ;
当我们想要调用上面的存储过程是,需要指定一个变量名来接收返回结果,此处指定为temp.
MariaDB [lyshark]> call CountProc(@temp);
Query OK, 1 row affected (0.00 sec)
MariaDB [lyshark]> select @temp;
+-------+
| @temp |
+-------+
|    17 |
+-------+
1 row in set (0.00 sec)
创建带参存储过程: 创建一个存储过程CountProc1,然后调用这个过程,定义SQL语句如下:
MariaDB [lyshark]> delimiter //
MariaDB [lyshark]> create procedure CountProc1(IN id int,OUT temp INT)
    -> BEGIN
    -> select count(*) into temp from lyshark where Gid=id;
    -> END //
Query OK, 0 rows affected (0.00 sec)
MariaDB [lyshark]> delimiter ;
接着我们调用CountProc1这个存储过程,并给它传递相应的参数.
MariaDB [lyshark]> select count(*) from lyshark where Gid=101;
+----------+
| count(*) |
+----------+
|        3 |
+----------+
1 row in set (0.00 sec)
MariaDB [lyshark]> call CountProc1(101,@num);
Query OK, 1 row affected (0.00 sec)
MariaDB [lyshark]> select @num;
+------+
| @num |
+------+
|    3 |
+------+
1 row in set (0.00 sec)
创建存储函数
存储函数的使用方法与MySQL内部函数的使用方法是一样的,在MySQL中,用户自己定义的存储函数与MySQL内部函数是一个性质的.区别在于,存储函数是用户自己定义的,而内部函数则是开发者编写的.
创建存储函数: 创建储存函数CountProc2,然后调用这个函数,SQL语句如下:
MariaDB [lyshark]> delimiter //
MariaDB [lyshark]> create function CountProc2(myid INT)
    -> returns int
    -> BEGIN
    -> return(select count(*) from lyshark where Gid=myid);
    -> END //
Query OK, 0 rows affected (0.02 sec)
MariaDB [lyshark]> delimiter ;
接着我们来调用这个存储函数,SQL语句如下:
MariaDB [lyshark]> select CountProc2(101);
+-----------------+
| CountProc2(101) |
+-----------------+
|               3 |
+-----------------+
1 row in set (0.00 sec)
以上可以看出,返回结果,虽然存储函数和存储过程的定义稍有不同,但是可以实现相同功能.
创建存储函数: 创建名称为NameZip,该函数返回select语句查询结果,数值类型为字符串,SQL语句如下:
MariaDB [lyshark]> delimiter //
MariaDB [lyshark]> create function NameZip()
    -> returns char(50)
    -> return (select s_name from suppliers where s_call='4521');
    -> //
Query OK, 0 rows affected (0.00 sec)
MariaDB [lyshark]> delimiter ;
调用一下看看效果,SQL语句如下.
MariaDB [lyshark]> select s_name from suppliers where s_call ='4521';
+------------+
| s_name     |
+------------+
| FastFruit. |
+------------+
1 row in set (0.00 sec)
MariaDB [lyshark]> select NameZip();
+------------+
| NameZip()  |
+------------+
| FastFruit. |
+------------+
1 row in set (0.00 sec)
如果在存储函数中的RETURN语句返回一个类型不同于函数的型的值,返回值将被强制为恰当的类型.
提示:指定参数为IN,OUT或者INOUT只对PROCEDURE是合法的.FUNCTION中总是默认为IN参数.RETURNS子句只能对FUNCTION做指定,对函数而言这是强制的.它用来指定函数的返回类型,而且函数体必须包含一个RETURN value语句.
声明使用变量
变量可以在子程序中声明并使用,这些变量的作用范围实在BEGIN...END程序中,本小姐将介绍定义和赋值一个变量,定义变量的语句如下:
DECLARE var_name[,varname]...date_type [DEFAULT value];
如上,var_name为局部变量名称,DEFAULT value子句给变量提供一个默认值,值除了可以被声明为一个常数之外,还可以被指定为一个表达式,如果没有DEFAULT子句,初始值为NULL.
定义变量: 定义名称为myparam的变量,类型为INT,默认值设置为100,只能在过程中使用.
DECLARE myparam INT DEFAULT 100;
DECLARE charsss char DEFAULT 'hello';
变量赋值: 定义3个变量,分别为var1,var2,var3,数据类型为INT,使用SET为变量赋值,代码如下:
DECLARE var1,var2,var3 INT;
MariaDB [lyshark]> set @var1=10,@var2=30;
Query OK, 0 rows affected (0.01 sec)
MariaDB [lyshark]> set @var3=@var1+@var2;
Query OK, 0 rows affected (0.00 sec)
MariaDB [lyshark]> select @var3;
+-------+
| @var3 |
+-------+
|    40 |
+-------+
1 row in set (0.00 sec)
使用数据光标
查询语句可能返回多条记录,如果数据量非常大,需要在存储过程和函数中使用光标来逐条读取查询结果集中的记录,光标必须在声明处理程序之前被声明,并且变量和条件还必须在声明光标或处理程序之前被声明.
声明光标: 声明名称为cursor_lyshark的光标,SQL代码如下:
declare cursor_lyshark cursor for select Name,Price from lyshark;
打开光标: 打开名称为cursor_lyshark的光标,SQL代码如下:
open cursor_lyshark
使用光标: 使用名称为cursor_lyshark的光标,将查询出的数据存入lyshark_name和lyshark_price这两个变量中.
fetch cursor_lyshark into lyshark_name,lyshark_price;
关闭光标: 关闭名称为cursor_lyshark的光标文件.
close cursor_lyshark
使用流程控制
流程控制语句用来根据条件控制语句的执行,MySQL中用来构造控制流程的语句有:IF,CASE,LOOP,LEAVE,ITERATE,REPEAT,WHILE等,每个流程中可能包含一个单独的语句,或者是使用BEGIN...END构造的复合语句,构造可以被嵌套.
IF-THEN-ELSE条件语句: IF语句用来判断条件分支
首先传递一个数值,接收到parameter变量里,然后自增+1,并判断,如果var=0则返回系统时间,var=1则返回系统日期.
CREATE PROCEDURE proc_1(IN parameter int)
BEGIN
    DECLARE var int;
    SET var=parameter+1;
		IF var=0
		THEN
				select CURRENT_TIME();
		ELSEIF var=1
		THEN
				select CURRENT_DATE();
		END IF;
  END
接着我们编译这段过程,并测试依次传入temp=-1和temp=1.
MariaDB [lyshark]> set @temp=0;
Query OK, 0 rows affected (0.00 sec)
MariaDB [lyshark]> call proc_1(@temp);
+----------------+
| CURRENT_DATE() |
+----------------+
| 2018-12-28     |
+----------------+
1 row in set (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
MariaDB [lyshark]> set @temp=-1;
Query OK, 0 rows affected (0.00 sec)
MariaDB [lyshark]> call proc_1(@temp);
+----------------+
| CURRENT_TIME() |
+----------------+
| 07:23:04       |
+----------------+
1 row in set (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
CASE-WHEN-THEN-ELSE语句: 另一个进行条件判断的语句,条件判断分支结构
 CREATE PROCEDURE proc_2 (IN parameter INT)
    BEGIN
      DECLARE var INT;
      SET var=parameter+1;
      CASE var
        WHEN 0 THEN
          select "这个数值是0呀";
        WHEN 1 THEN
          select "这个数值是1呀";
        ELSE
          select "这个数值是其他呀";
      END CASE ;
    END ;
MariaDB [lyshark]> set @temp=0;
Query OK, 0 rows affected (0.00 sec)
MariaDB [lyshark]> call proc_2(@temp);
+---------------------+
| 这个数值是1呀       |
+---------------------+
| 这个数值是1呀       |
+---------------------+
1 row in set (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
MariaDB [lyshark]> set @temp=-1;
Query OK, 0 rows affected (0.00 sec)
MariaDB [lyshark]> call proc_2(@temp);
+---------------------+
| 这个数值是0呀       |
+---------------------+
| 这个数值是0呀       |
+---------------------+
1 row in set (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
MariaDB [lyshark]> set @temp=-9999;
Query OK, 0 rows affected (0.00 sec)
MariaDB [lyshark]> call proc_2(@temp);
+--------------------------+
| 这个数值是其他呀         |
+--------------------------+
| 这个数值是其他呀         |
+--------------------------+
1 row in set (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
LOOP语句: 用于循环执行重复语句,LOOP只会创建一个循环过程,并不会判断.
首先使用LOOP语句进行循环操作,id值小于等于5之前,将重复执行循环过程,代码如下:
CREATE PROCEDURE proc_4()
	BEGIN
      DECLARE id INT;
      SET id=0;
      LOOP_LABLE:LOOP
		SELECT "这里开始计数";
        SET id=id+1;
        IF id >=5 THEN
          LEAVE LOOP_LABLE;  #退出循环
        END IF;
      END LOOP;
	END;
WHWHILE-DO…END-WHILE语句: 流程循环语句.
CREATE PROCEDURE proc_4()
    BEGIN
      DECLARE var INT;
      SET var=0;
      WHILE var<6 DO
        select "循环判断";
        SET var=var+1;
      END WHILE ;
    END;
ITERATE语句: 通过引用复合语句的标号,来从新开始复合语句
CREATE PROCEDURE proc_5()
  BEGIN
    DECLARE v INT;
    SET v=0;
    LOOP_LABLE:LOOP
      IF v=3 THEN
        SET v=v+1;
        ITERATE LOOP_LABLE;
      END IF;
      INSERT INTO t VALUES(v);
      SET v=v+1;
      IF v>=5 THEN
        LEAVE LOOP_LABLE;
      END IF;
    END LOOP;
  END;
REPEAT语句: 此语句的特点是执行操作后检查结果
CREATE PROCEDURE proc_6 ()
    BEGIN
      DECLARE v INT;
      SET v=0;
      REPEAT
        INSERT INTO t VALUES(v);
        SET v=v+1;
        UNTIL v>=5
      END REPEAT;
    END;
## 查看删除过程
MySQL中,用户可以使用SHOW STATUS语句或SHOW CREATE语句来查看存储过程和函数,也可以直接从系统的information_schema数据库中查询
show status查看存储过程:
MariaDB [lyshark]> show procedure status like 'p%' \G
*************************** 1. row ************************
                  Db: lyshark
                Name: proc_1
                Type: PROCEDURE
             Definer: lyshark@%
            Modified: 2018-12-28 21:16:26
             Created: 2018-12-28 21:16:26
       Security_type: DEFINER
             Comment:
character_set_client: utf8mb4
collation_connection: utf8mb4_general_ci
  Database Collation: latin1_swedish_ci
12 rows in set (0.00 sec)
show create查看过程与函数:
MariaDB [lyshark]> show create function lyshark.NameZip;
+----------+----------+--------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+--------------------+
| Function | sql_mode | Create Function                                                                                                                                  | character_set_client | collation_connection | Database Collation |
+----------+----------+--------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+--------------------+
| NameZip  |          | CREATE DEFINER=`root`@`localhost` FUNCTION `NameZip`() RETURNS char(50) CHARSET latin1
return (select s_name from suppliers where s_call='4521') | utf8                 | utf8_general_ci      | latin1_swedish_ci  |
+----------+----------+--------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+--------------------+
select 查询存储过程:
MariaDB [lyshark]> select name,created from mysql.proc where db="lyshark" and type="PROCEDURE";
+------------+---------------------+
| name       | created             |
+------------+---------------------+
| CountProc  | 2018-12-28 04:19:58 |
| CountProc1 | 2018-12-28 04:31:10 |
| Proc       | 2018-12-28 03:47:30 |
| proc11111  | 2018-12-28 21:24:19 |
| proc3      | 2018-12-28 05:34:18 |
| proc4      | 2018-12-28 05:37:10 |
| proc8      | 2018-12-28 21:27:12 |
| proc_1     | 2018-12-28 07:20:08 |
| proc_111   | 2018-12-28 21:14:01 |
| proc_1111  | 2018-12-28 21:14:16 |
| proc_2     | 2018-12-28 07:27:32 |
| proc_3     | 2018-12-28 07:35:11 |
| proc_4     | 2018-12-28 21:15:40 |
| proc_444   | 2018-12-28 21:16:26 |
| wang       | 2018-12-28 04:19:07 |
| wang1      | 2018-12-28 04:25:30 |
+------------+---------------------+
16 rows in set (0.00 sec)
select 查询存储函数:
MariaDB [lyshark]> select name,created from mysql.proc where db="lyshark" and type="FUNCTION";
+------------+---------------------+
| name       | created             |
+------------+---------------------+
| CountProc2 | 2018-12-28 05:04:28 |
| NameZip    | 2018-12-28 05:16:35 |
+------------+---------------------+
2 rows in set (0.00 sec)
show语句的其他用法:
MariaDB [lyshark]> show procedure status;
MariaDB [lyshark]> show function status;
删除过程与函数:
drop procedure lyshark;
drop function countproc;
参考文献:mysql5.7从入门到精通
MariaDB 存储过程与函数(10)的更多相关文章
- MariaDB/MySQL存储过程和函数
		本文目录:1.创建存储过程.函数 1.1 存储过程的IN.OUT和INOUT2.修改和删除存储过程.函数3.查看存储过程.函数信息 在MySQL/MariaDB中,存储过程(stored proced ... 
- MariaDB的存储过程和函数
		创建存储过程 DELIMITER $$ DROP PROCEDURE IF EXISTS `sp_test1`; CREATE PROCEDURE sp_test1(IN a int, IN b in ... 
- MySQL主从环境下存储过程,函数,触发器,事件的复制情况
		下面,主要是验证在MySQL主从复制环境下,存储过程,函数,触发器,事件的复制情况,这些确实会让人混淆. 首先,创建一张测试表 mysql),age int); Query OK, rows affe ... 
- MySQL 系列(三)你不知道的 视图、触发器、存储过程、函数、事务、索引、语句
		第一篇:MySQL 系列(一) 生产标准线上环境安装配置案例及棘手问题解决 第二篇:MySQL 系列(二) 你不知道的数据库操作 第三篇:MySQL 系列(三)你不知道的 视图.触发器.存储过程.函数 ... 
- MySQL 第十天(视图、存储过程、函数、触发器)
		MySql高级-视图.函数.存储过程.触发器 目录 一.视图 1 1.视图的定义 1 2.视图的作用 1 (1)可以简化查询. 1 (2)可以进行权限控制, 3 3.查询 ... 
- MySQL4:存储过程和函数
		什么是存储过程 简单说,存储过程就是一条或多条SQL语句的集合,可视为批文件,但是起作用不仅限于批处理.本文主要讲解如何创建存储过程和存储函数以及变量的使用,如何调用.查看.修改.删除存储过程和存储函 ... 
- PKG_COLLECTION_LHR 存储过程或函数返回集合类型
		存储过程或函数可以返回集合类型,方法很多,今天整理在一个包中,其它情况可照猫画虎. CREATE OR REPLACE PACKAGE PKG_COLLECTION_LHR AUTHID CURREN ... 
- Mysql学习笔记(十)存储过程与函数  +  知识点补充(having与where的区别)
		学习内容:存储程序与函数...这一章学的我是云里雾里的... 1.存储过程... Mysql存储过程是从mysql 5.0开始增加的一个新功能.存储过程的优点其实有很多,不过我觉得存储过程最重要的 ... 
- mySQL 教程 第7章 存储过程和函数
		存储过程和存储函数 MySQL的存储过程(stored procedure)和函数(stored function)统称为stored routines. 1. MySQL存储过程和函数的区别 函数只 ... 
随机推荐
- 在Eclipse中运行JAVA代码远程操作HBase的示例
			在Eclipse中运行JAVA代码远程操作HBase的示例 分类: 大数据 2014-03-04 13:47 3762人阅读 评论(2) 收藏 举报 下面是一个在Windows的Eclipse中通过J ... 
- 8月的list
			多校的list: 第一周的多校list: k路归并 (思想大概理解了,还没实现 莫比乌斯 树归 第三场的多校list: 斯坦纳树 第四场多校: Pollard_rho算法和Miller_Rabin ... 
- 2018.11.08 UVA11021 Tribles(概率dp)
			传送门 概率dpdpdp简单题. 设f[i]f[i]f[i]表示第iii天的答案. 然后枚举ppp数组从fi−1f_{i-1}fi−1转移过来就行了. 显然有fi=∑j=0npj∗(fi−1)jf_ ... 
- Winform自定义表单(转)
			出处:http://www.newlifex.com/showtopic-167.aspx 好吧,附件真的损坏了,原始代码我也没有了,再提取我也没精力了,不好意思,哪位之前下过可以重发一遍吗?不过即使 ... 
- Le Chapitre IX
			Je crois qu'il profita, pour son évasion[evazjɔ̃]逃跑, d'une migration d'oiseaux sauvages[sovaʒ]未驯化的. ... 
- IntelliJ IDEA 2017版 编译器使用学习笔记(九)(图文详尽版);IDE使用的有趣的插件;IDE代码统计器;Mybatis插件
			一.代码统计器,按照名字搜索即可,在file===setting------plugin 使用右键项目:点击自动统计 二.json转实体类 三.自动找寻bug插件 四.Remind me工具 五.检测 ... 
- IntelliJ IDEA   启动 自动进入项目列表,IDE启动不进入项目,IDE启动不进入上一次的项目
			1.希望IDE启动后,不进入上次使用的项目,而进入如图 2.项目很多,想着切换不方便,还得在启动打开前,点击取消,而且拖慢IDE启动的速度,所以进入这个项目列表页还是很好的. 3.设置方法 首先,任意 ... 
- Event.target和Event.currentTarget的区别
			<style> * { margin:0; padding:0; list-style:none; } #ul { width:400px; height:250px; margin:0 ... 
- jq,ajax,post例子。
			jq post 例子 <script> $(function(){ $('#button').on('click', function(){ $.ajax({ type: 'POST', ... 
- [转]MySQL源码:Range和Ref优化的成本评估
			MySQL源码:Range和Ref优化的成本评估 原文链接:http://www.orczhou.com/index.php/2012/12/mysql-source-code-optimizer-r ... 
