目录

什么是存储过程?

特点

语法格式

局部变量

用户变量

系统变量

查看修改全局变量

查看修改会话变量

传入参数

输出参数

修改传入参数值

每文一语


什么是存储过程?

MySQL 5.0 版本开始支持存储过程。

简单的说,存储过程就是一组SQL语句集,功能强大,可以实现一些比较复杂的逻辑功能,类似于JAVA语言中的方法;Python里面的函数;

存储过就是数据库 SQL 语言层面的代码封装与重用。

特点

有输入输出参数,可以声明变量,有if/else, case,while等控制语句,通过编写存储过程,可以实现复杂的逻辑功能;

函数的普遍特性:模块化,封装,代码复用;

速度快,只有首次执行需经过编译和优化步骤,后续被调用可以直接执行,省去以上步骤;

语法格式

delimiter 自定义结束符号
create procedure 储存名([ in ,out ,inout ] 参数名 数据类形...)
beginsql语句
end 自定义的结束符合
delimiter ;
delimiter $$
create procedure proc01()
beginselect empno,ename from emp;
end  $$
delimiter ;-- 调用存储过程
call proc01();

注意创建的时候需要指定delimiter $$(自定义的,但是通常使用这个),然后使用create procedure 储存名(有输入参数 输出参数) 然后记住有begin 和end 之间就写SQL语句,并且需要在end后面加上$$,最后用delimiter ;

局部变量

用户自定义,在begin/end块中有效 ,也就是相对于在函数内部中声明变量

语法: 声明变量 declare var_name type [default var_value];
举例:declare nickname varchar(32);

关键词:declare 变量名 类型(长度)可以加默认值——类似于我们python或者java中的 int a=10;

delimiter $$
create procedure proc02()
begindeclare var_name01 varchar(20) default ‘aaa’;  -- 定义局部变量set var_name01 = ‘zhangsan’;  select var_name01;
end $$
delimiter ;
-- 调用存储过程
call proc02();

定义变量之后,使用set给变量赋值

MySQL 中还可以使用 SELECT..INTO 语句为变量赋值。其基本语法如下:

select col_name [...] into var_name[,...]
from table_name wehre condition 其中:
col_name 参数表示查询的字段名称;
var_name 参数是变量的名称;
table_name 参数指表的名称;
condition 参数指查询条件。
注意:当将查询结果赋值给变量时,该查询语句的返回结果只能是单行单列(单元格值)
delimiter $$
create procedure proc03()
begindeclare my_ename varchar(20) ;select ename into my_ename from emp where empno=1001;select my_ename;
end $$
delimiter ;
-- 调用存储过程
call proc03();

如果是在内部声明的变量,并且进行了赋值之后,那么在内部调用显示的时候,可以直接select就可以实现展示数据的效果

用户变量

用户自定义,当前会话(连接)有效。类比java的成员变量

语法:

@var_name

不需要提前声明,使用即声明

delimiter $$
create procedure proc04()
beginset @var_name01  = 'ZS';
end $$
delimiter;
call proc04() ;
select @var_name01  ;  --可以看到结果

这里使用@进行声明,前提不需要对其类型进行声明,直接可以赋值,但是调用的时候也需要@变量名

声明一般有两种方法:

1、declare 变量名 类型(长度)

然后使用set 变量名 = 值 接收

或者使用新值 into 变量名

2、直接使用@变量名=?

但是这个在整个会话都有作用,调用的时候需要使用@变量名

系统变量

系统变量又分为全局变量与会话变量

全局变量在MYSQL启动的时候由服务器自动将它们初始化为默认值,这些默认值可以通过更改my.ini这个文件来更改。

会话变量在每次建立一个新的连接的时候,由MYSQL来初始化。MYSQL会将当前所有全局变量的值复制一份。来做为会话变量。

也就是说,如果在建立会话以后,没有手动更改过会话变量与全局变量的值,那所有这些变量的值都是一样的。

全局变量与会话变量的区别就在于,对全局变量的修改会影响到整个服务器,但是对会话变量的修改,只会影响到当前的会话(也就是当前的数据库连接)。

有些系统变量的值是可以利用语句来动态进行更改的,但是有些系统变量的值却是只读的,对于那些可以更改的系统变量,我们可以利用set语句进行更改。

查看修改全局变量

-- 查看全局变量
show global variables;
-- 查看某全局变量
select @@global.auto_increment_increment;
-- 修改全局变量的值
set global sort_buffer_size = 40000;
set @@global.sort_buffer_size = 40000;

查看修改会话变量

-- 查看会话变量
show session variables;
-- 查看某会话变量
select @@session.auto_increment_increment;
-- 修改会话变量的值
set session sort_buffer_size = 50000;
set @@session.sort_buffer_size = 50000 ;

传入参数

in 表示传入的参数, 可以传入数值或者变量,即使传入变量,并不会更改变量的值,可以内部更改,仅仅作用在函数范围内。

注意:这里参入参数如果和字段名一样的话,一般不要命名一样的名字,如果不小心命名一样的,那么也需要在表中指定,表.字段

而且需要注意的是声明输入参数:in 参数名 类型(长度)

-- 封装有参数的存储过程,传入员工编号,查找员工信息
delimiter $$
create procedure dec_param01(in param_empno varchar(20))
beginselect * from emp where empno = param_empno;
end $$delimiter ;
call dec_param01('1001');
-- 封装有参数的存储过程,可以通过传入部门名和薪资,查询指定部门,并且薪资大于指定值的员工信息
delimiter $$
create procedure dec_param0x(in dname varchar(50),in sal decimal(7,2),)
beginselect * from dept a, emp b where b.sal > sal and a.dname = dname;
end $$delimiter ;
call dec_param0x('学工部',20000);

通过上述的案例,我们也可以发现,一般如果传入参数的时候,是字符串就用varchar(),如果是数值就用decimal(),当然有时候也可以使用数值类型,字符类型。

输出参数

out 表示从存储过程内部传值给调用者

-- ---------传出参数:out---------------------------------
use mysql7_procedure;
-- 封装有参数的存储过程,传入员工编号,返回员工名字
delimiter $$
create procedure proc08(in empno int ,out out_ename varchar(50) )
beginselect ename into out_ename from emp where emp.empno = empno;
end $$delimiter ;call proc08(1001, @o_ename);
select @o_ename;

输出的时候,需要在存储方法中指定,并@变量名,最后才能让这个变量接收到数值

其次输出参数的定义的时候,也和输入参数一样的,out 参数名 类型(长度)

-- 封装有参数的存储过程,传入员工编号,返回员工名字和薪资
delimiter $$
create procedure proc09(in empno int ,out out_ename varchar(50) ,out out_sal decimal(7,2))
beginselect ename,sal into out_ename,out_sal from emp where emp.empno = empno;
end $$delimiter ;call proc09(1001, @o_dname,@o_sal);
select @o_dname;
select @o_sal;

内部接收的时候就需要使用 into 变量名,变量名……

注意:也就是说,在存储过程中使用out声明输出参数,在内部视图into 进行赋值之后,最后在调用存储的时候需要在里面自定义一个变量进行接收 但是必须要 使用@变量名

修改传入参数值

inout 表示从外部传入的参数经过修改后可以返回的变量,既可以使用传入变量的值也可以修改变量的值(即使函数执行完)

-- 传入员工名,拼接部门号,传入薪资,求出年薪
delimiter $$
create procedure proc10(inout inout_ename varchar(50),inout inout_sal int)
beginselect  concat(deptno,"_",inout_ename) into inout_ename from emp where ename = inout_ename;set inout_sal = inout_sal * 12;
end $$
delimiter ;
set @inout_ename = '关羽';
set @inout_sal = 3000;
call proc10(@inout_ename, @inout_sal) ;
select @inout_ename ;
select @inout_sal ;

相对于,如果我们使用inout关键词,这个参数可以作为输入参数,也可以作为输出参数,输出参数时候,可以在内部的语句进行修改,然后覆盖原来的值,最后调用的时候可以定义一样的变量名,也可以不一样。

in 输入参数,意思说你的参数要传到存过过程的过程里面去,在存储过程中修改该参数的值不能被返回

out 输出参数:该值可在存储过程内部被改变,并向外输出

inout 输入输出参数,既能输入一个值又能传出来一个值)

每文一语

当你觉得这个事情无法实现的时候,或者你觉得烦闷的时候,每天消灭一点点,可能你就爱上它了

MySQL的存储过程——输入参数(in)、输出参数(out)、输入输出参数(inout)相关推荐

  1. 5.1.6 假脱机技术(输入井、输出井、输入输出缓冲区、共享打印机原理分析)

    0. 知识总览 1. 什么是脱机技术? 2. 假脱机技术 2.1 输入井和输出井 2.2 输入进程与输出进程 2.3 输入输出缓冲区 3. 共享打印机原理分析 4. 知识回顾与重要考点 0. 知识总览 ...

  2. mysql 扩展存储过程_MySQL4:存储过程和函数

    什么是存储过程 简单说,存储过程就是一条或多条SQL语句的集合,可视为批文件,但是起作用不仅限于批处理.本文主要讲解如何创建存储过程和存储函数以及变量的使用,如何调用.查看.修改.删除存储过程和存储函 ...

  3. MySQL 高级 - 存储过程 - 语法 - if判断 || 传递参数 (IN - 输入 OUT-输出)

    MySQL 高级 - 存储过程 - 语法 - if判断 传递参数

  4. mysql函数输出参数_函数--返回值、参数和作用域

    一.函数的返回值--return的作用 1.return将return后面的值作为函数的输出返回值,当函数被调用时,返回值可以被其他变量接收.使用. 而print只是打印在控制台,一个函数如果没有re ...

  5. oracle调用存储过程output,vb.net 调用oracle的存储过程的方法(带输入参数 和输出参数或者返回记录集)...

    1.直接调用存储过程 2 是用包的方式调用存储过程 3 调用存储过程且该存储过程返回记录集 这种必须使用包的方式 1.直接调用存储过程 测试存储过程为: create or replace proce ...

  6. mysql数据存储过程详解_mysql数据存储过程参数实例详解

    MySQL 存储过程参数有三种类型:in.out.inout.它们各有什么作用和特点呢? 一.MySQL 存储过程参数(in) MySQL 存储过程 "in" 参数:跟 C 语言的 ...

  7. SSM中使用注解方式调用输入输出参数存储过程,输入参数为javabean方式,Boolean类型对应TINYINT类型

    最近在捣鼓SSM使用注解方式调用有输入输出参数的存储过程,趟了不少坑,网上一堆没用抄袭的,废话不多说,直接上代码. Controller层: /*** 注册用户** @param userName* ...

  8. mysql 调用存储过程 inout_MySQL存储过程in、out和inout参数示例和总结

    存储过程 1.创建存储过程并查看全局变量 mysql> create database yy; Query OK, 1 row affected (0.00 sec) mysql> use ...

  9. shell输入指定日期参数,输出该日期的前一天和后一天

    shell输入指定日期参数,输出该日期的前一天和后一天 #!/bin/bash c=$1 if [ $# == 1 ]; then yesterday=`date -d "$c -1 day ...

最新文章

  1. python读取txt文件代码-从文本文件中读取Python代码
  2. Winpcap进行抓包,分析数据包结构并统计IP流量
  3. 操作系统实现(一):从Bootloader到ELF内核
  4. Oracle查找重复数据
  5. 并发编程-02并发基础CPU多级缓存和Java内存模型JMM
  6. vue-cookies使用方法,vue中使用获取cookie
  7. restful api接口规范_Restful API设计规范
  8. win10删除开机密码_取消WIN10开机密码的方法
  9. 【实践】58同城本地服务推荐系统演进
  10. 读 自己动手写操作系统
  11. 笔记本电脑触摸板手势命令
  12. 失眠就吃安眠药真的好吗?好心情送你沾枕到天亮的诀窍
  13. 【Tool】资料搜索:百度网盘资料检索
  14. 数据结构作业(校园导航系统)
  15. andorid xmlns:tools=“http://schemas.android.com/tools“是用来做什么的?
  16. edup无线网卡驱动安装linux,EDUP EP-N8513 (RTL8188CUS芯片)在Ubuntu 12.10下的wifi不能连接问题解决方法...
  17. 【C++】C++静态库和动态库的区别
  18. laydate日期控件修改去除秒保留时分
  19. 概率统计D 01.06 伯努利概型
  20. PyCharm2020介绍

热门文章

  1. mysql ip鉴权_网站登录鉴权的实现
  2. 十面埋伏(DFS,标记)
  3. 服务器微信推送,开启服务器消息推送后收不到微信推送的数据
  4. 苹果App被拒常见原因
  5. Saluton+ 1.0 你值得拥有!
  6. 计算机无线模块怎样关闭,开启或关闭计算机的无线网卡
  7. onscroll事件与onscrollTop
  8. Spring如何整合Mybatis?
  9. 狂神redis课程笔记
  10. QQ互联登录 微博登录问题