MySQL存储过程中IN、OUT、INOUT参数使用

MySQL存储过程中IN、OUT、INOUT参数使用

MySQL存储过程的参数用在存储过程的定义,共有三种参数类型,IN、OUT、INOUT形式如:
CREATE PROCEDURE([IN|OUT|INOUT] 参数名 数据类型,…)

IN 输入参数:表示该参数的值必须在调用存储过程时指定,在存储过程中修改该参数的值不能被返回,为默认值。| 意思是说你的参数要传到存储过程的过程里面去

OUT 输出参数:该值可在存储过程内部被改变,并可返回 | 代表往外输出 

INOUT 输入输出参数:调用时指定,并且可被改变和返回 | 既能输入一个值又能传出来一个值

我们常用的操作数据库语言SQL语句在执行的时候需要先编译,然后执行,而存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给定参数(如果该存储过程带有参数)来调用执行它。

一个存储过程是一个可编程的函数,它在数据库中创建并保存。它可以有SQL语句和一些特殊的控制结构组成。当希望在不同的应用程序或平台上执行相同的函数,或者封装特定功能时,存储过程是非常有用的。数据库中的存储过程可以看做是对编程中面向对象方法的模拟,它允许控制数据的访问方式。

存储过程通常有以下优点:
(1)存储过程增强了SQL语言的功能和灵活性。存储过程可以用流控制语句编写,有很强的灵活性,可以完成复杂的判断和较复杂的运算。

(2)存储过程允许标准组件是编程。存储过程被创建后,可以在程序中被多次调用,而不必重新编写该存储过程的SQL语句。而数据库专业人员可以随时对存储过程进行修改,对就用程序源代码毫无影响。

(3)存储过程能实现较快的执行速度。如果某一操作包含大量的Transaction-SQL 代码或分别被多次执行,那么存储过程要比批处理的执行速度快很多。因为存储过程是预编译的。在首次运行一个存储过程时查询,优化器对其进行分析优化,并且给出最终被存储在系统表中的执行计划。而批处理的Transaction-SQL语句在每次运行时都要进行编译和优化,速度相对要慢一些。

(4)存储过程能减少网络流量。针对同一个数据库对象的操作(如查询,修改),如果这一操作所涉及的Transaction-SQL语句被组织存储过程,那(么当在客户计算机上调用该存储过程时,内乡中传送的只是该调用语句,从而大大增加了网络流量并降低了网络负载。

(5)存储过程可被作为一种安全机制来充分利用。系统管理员通过执行某一存储过程的权限进行限制,能够实现对相应的数据的访问权限的限制,避免了非授权用户对数据的访问,保证了数据的。

求1-n的和:
MariaDB [(none)]> DELIMITER $$
MariaDB [(none)]> CREATE PROCEDURE p1(IN n int)
    -> BEGIN
    -> declare total int default 0;
    -> declare num int default 0;
    -> WHILE num < n do
    -> set num:=num+1;
    -> set total:=total+num;
    -> end while;
    -> select total;
    -> end$$
    MariaDB [(none)]> DELIMITER ;

    注:
    这里需要注意的是DELIMITER $$ 和DELIMITER ; 两句,DELIMITER是分割符的意思,因为MYSQL默认以“;”为分隔符,如果我们没有声明分割符,那么编译器会把存储过程当成SQL语句进行处理,则存储过程的过程会报错,所以要事先用DELIMITER关键字申明当前段分隔符,这样MYSQL才会将”;”当做存储过程中的代码,不会执行这些代码,用完了之后 要把分隔符不愿。

    过程体的开始与结束使用BEGIN和END进行标识。

MariaDB [hellodb]> DELIMITER $$
MariaDB [hellodb]> CREATE PROCEDURE p2(IN pp int)   //IN 的使用例子
   -> BEGIN
   -> SELECT pp;
   -> SET pp=2;
   -> SELECT pp;
   -> END$$
Query OK, 0 rows affected (0.01 sec)

MariaDB [hellodb]> DELIMITER ;

MariaDB [hellodb]> SELECT @pp;
+——+
| @pp  |
+——+
|    1 |
+——+
1 row in set (0.00 sec)

MariaDB [hellodb]> CALL p2(@pp);
+——+
| pp   |
+——+
|    1 |
+——+
1 row in set (0.01 sec)

+——+
| pp   |
+——+
|    2 |
+——+
1 row in set (0.01 sec)

Query OK, 0 rows affected (0.01 sec)

MariaDB [hellodb]> SELECT @pp; //从这里可以看出IN 参数的话是,在内部改变,外部是不变的。
+——+
| @pp  |
+——+
|    1 |
+——+
1 row in set (0.00 sec)

MariaDB [hellodb]> DELIMITER $$
MariaDB [hellodb]> CREATE PROCEDURE p4(OUT pp INT)   //OUT 参数的使用
    -> BEGIN
    -> SELECT pp;
    -> SET pp=2;
    -> SELECT pp;
    -> END$$
Query OK, 0 rows affected (0.01 sec)

MariaDB [hellodb]> DELIMITER ;
MariaDB [hellodb]> SET @pp=1;
Query OK, 0 rows affected (0.00 sec)

MariaDB [hellodb]> SELECT @pp;
+——+
| @pp  |
+——+
|    1 |
+——+
1 row in set (0.00 sec)

MariaDB [hellodb]> CALL p4(@pp);
+——+
| pp   |
+——+
| NULL | //从这里就可以看出,OUT是只往外输出 ,不会接受往内输入的参数
+——+
1 row in set (0.01 sec)

+——+
| pp   |
+——+
|    2 |
+——+
1 row in set (0.01 sec)

Query OK, 0 rows affected (0.01 sec)

MariaDB [hellodb]> SELECT @pp;
+——+
| @pp  |
+——+
|    2 |
+——+
1 row in set (0.00 sec)

MariaDB [hellodb]> 

总结IN、OUT区别:
IN:表示输入一个值,你需要一个值,我给你一个值
OUT:你往外输出一个值,你输出的那个值我就拿一个变量来接收你给我输出的那个值

MariaDB [hellodb]> DELIMITER $$
MariaDB [hellodb]> CREATE PROCEDURE p5(INOUT pp INT) //INOUT 参数的使用
    -> BEGIN
    -> SELECT pp;
    -> SET pp=2;
    -> SELECT pp;
    -> END$$
Query OK, 0 rows affected (0.01 sec)

MariaDB [hellodb]> DELIMITER ;
MariaDB [hellodb]> SET @pp=1;
Query OK, 0 rows affected (0.00 sec)

MariaDB [hellodb]> SELECT @pp;
+——+
| @pp  |
+——+
|    1 |
+——+
1 row in set (0.00 sec)

MariaDB [hellodb]> CALL p5(@pp);
+——+
| pp   |
+——+
|    1 | //既可接收输入的参数
+——+
1 row in set (0.02 sec)

+——+
| pp   |
+——+
|    2 |
+——+
1 row in set (0.02 sec)

Query OK, 0 rows affected (0.02 sec)

MariaDB [hellodb]> SELECT @pp;
+——+
| @pp  |
+——+
|    2 | //也可改变输出的参数
+——+
1 row in set (0.00 sec)

MariaDB [hellodb]> 

原创文章,作者:dance_man,如若转载,请注明出处:http://www.178linux.com/75046

(2)
dance_mandance_man
上一篇 2017-05-08
下一篇 2017-05-08

相关推荐

  • Ansible_variable

    Ansible变量        系统自动化让重复的工作变得更加容易,但是每个系统还是有一些细微的差别,变量就是如何处理系统之间的不同之处。这里将会列出变量的极大部分使用方法。   本文假设:你已经知道如何使用Ansible。知道inventory,facts等概念。   Ans…

    Linux干货 2015-11-26
  • 第一周学习内容

    1、LINUX的三大主流版本:debian slackware redhat 2、一个完整的操作系统是由内核+运行在内核之上的应用程序组成。      LINUX操作系统是由linux内核+GNU开源组织编写的应用程序组成(GNU/Linux) 3、CPU架构:X86(X64)、摩托罗拉的m68k、arm、IBM的POWER(性…

    Linux干货 2016-12-03
  • Nginx 功能概述与基础应用!

           本篇博客主要有三个部分组成,目的在于让大家了解ningx的主要功用及作为web server的基础配置;通过本篇博客能够让您对nginx理解更加深入,以便于更好的使用它!                  …

    2017-05-14
  • N25 the second week

    1.文件管理命令 1.1.cat concatenate files and print on the standard output # 正序打印文件 cat [OPTION]… [FILE]… # 常用参数 -n 编号显示每行 -E 显示每行的结束符 1.2.tac concatenat…

    Linux干货 2016-12-19
  • 魔术方法 反射

    魔术方法 反射 反射(reflection):指的是运行时获取类型定义信息。一个对象能够在运行时像照镜子一样反射出其类型信息;也就是说能够通过一个对象,找到自己的type、class、attribute、或method的能力,称为反射或者自省。 具有反射能力的函数:type、isinstance、callable、dir、getattr。 运行时和编译时不同…

    Linux干货 2017-11-30
  • 三次握手和四次挥手

    今天来聊一下事实标准协议TCP/IP中传输层里TCP协议中,主机与服务器建立连接时的三次握手,和断开连接时的四次挥手。 本博文分两部分介绍,    一:状态详解    二:三次握手和四次挥手状态介绍 这里总共涉及到十种状态,其实总共有十一种状态,接下来分别介绍一下它们; 一:状态详解 CLOSED:关闭—&…

    2017-09-01