/*
存储过程 在一些语言中,有一个概念叫”过程“ procedure,和”函数“ function 过程:封装了若干条语句,调用时,这些封装体执行
函数:是一个有返回值的“过程”
过程:没有返回值的函数 我们把若干条sql封装起来,起个名字---过程
把此过程存储在数据库中---存储过程 */ -- 创建一个简单的存储过程
create procedure p1()
begin
select 1+2 ;
end; --查看已有的procedure
show procedure status; --调用存储过程
call p1(); --存储过程引入变量和控制结构
/*
存储过程是可以编程的
意味着可以使用变量,表达式,控制结构来完成复杂的操作
在存储过程中使用declare声明变量
格式 declare 变量名 变量类型 [default 默认值]
只是简单的声明输出变量值不能满足我们的要求,我们喜欢用变量做一些运算,如:+*-/
运算的结果,如何复制给变量呢?
set 变量名 := exp
  select num into rnum from goods where gid=new.gid;
select count(*) from goods into countData;//这样可以赋值给countData变量 控制结构:
if/else语句:格式:
if condition then
statement
else
statement
end if;
if/elseif/else语句:格式:
if condition then
statement
elseif condition then
statement
...
end if; --给存储过程传参
存储过程的括号里,可以声明参数
语法是: [in/out/inout] 参数名 参数类型
*/ --使用变量的存储过程
create procedure p2()
begin
declare height int default 180;
declare age int default 18;
select concat('年龄',age,'身高',height);
end; call p2(); --加入运算
create procedure p3()
begin
declare age int default 18;
set age=age+20;
select concat('20年后这么大了:',age);
end; call p3(); --加入控制语句
create procedure p4()
begin
declare age int default 18;
set age=age+20;
if age<12 then
select '未成年';
else
select '成年人';
end if;
end; call p4(); --使用简单的参数
create procedure p5(width int,height int) -- 求面积
begin
select concat('你的面积是',width*height) as area; if width>height then
select '你很胖';
elseif width<height then
select '你很瘦';
else
select '你挺方';
end if;
end; call p5(4,5); /*
循环语句
while循环
*/
create procedure p6()
begin
declare total int default 0;
declare num int default 0; while num<100 do
set total :=total+num;
set num :=num+1;
end while; select total;
end; call p6();
--1~n的和
create procedure p7(num int)
begin
declare total int default 0; while num>0 do
set total :=total+num;
set num :=num-1;
end while; select total;
end;
call p7(3);
/*
输出型参数 in out inout
默认使用的是in型,in型就是简单的接收参数,然后在过程中使用。无法向外界返回
三种类型的区别:
in:将变量或者常量作为参数传递进入存储过程,但是无法返回。存储过程外的原来的变量的值不会改变。相当于java中的方法,参数是基本数据类型
out:将变量作为参数传入,如果原来的变量有值,将值变为null传入,相当于参数只是声明的变量。返回经过存储过程中存储的该变量的值在对应的out变量上。out类型的变量类似于成员变量
inout:inout兼并in和out的特点。只能传入变量,但是原来变量的值可以传入进来而不会清除为null,仍然保留原来的值,和in效果一样。结束存储过程后out变量的值也改变了,也相当于成员变量
*/
create procedure p8(in n int)
begin
declare total int default 0; while n>0 do
set total := total+n;
set n :=n-1;
end while; select total;
end; call p8(10);
--传入变量值也可以
set @n :=10;
call p8(@n); drop procedure p9;
--使用out型变量
create procedure p9(in n int,out total int)
begin
declare num int default 0;
select total;
while num<n do
set num :=num+1;
set total :=total+num; end while;
end; call p9(100);-- 参数必须一一对应
call p8(10,8); --这个也报错,out型的指的是过程要输出的变量,一定是变量而不是常量
--传入变量试试
set @n :=10;
call p9(10,@n);
select @n;
-- 经过测试,out型参数传入的变量前面会自动将值变成null,null值具有特殊性,沾到什么什么变null。所以输出的就是null了。希望得到0~n累加的结果,先修改存储过程给变量一个初值。
drop procedure p9;
create procedure p9(in n int,out total int)
begin
declare num int default 0;
set total :=0;
while num<n do
set num :=num+1;
set total :=total+num; end while;
end; call p9(10,@a);
select @a;
-- out类型的参数,我的理解是如果存在将原来的分配的值的地址删掉,变为null,如果不存在声明一个变量。在存储过程中对变量操作。该变量类似于成员变量。 -- 第三种参数类型:inout,inout和out的区别在于inout可以得到前面输入的参数的值而不会抹去变为null create procedure p10(in n int,inout total int)
begin
declare num int default 0;
while num<n do
set num :=num+1;
set total :=total+num; end while;
end; set @n:=10;
call p10(10,8);--报错,类型错误,与out有关就只能是参数为变量
call p10(10,@n); -- 成功。并且累加到@n上面了
select @n; create procedure p11(in n int) --测试in
begin
set n:=n+10;
select n;
end; call p11(@n);
select @n;
-- case语句
create procedure p12()
begin
declare pos int default 0;
set pos := floor(4*rand());
case pos
when 1 then select '在飞';
when 2 then select '掉到海里去了';
when 3 then select '在小岛上';
else select '我也不知道在哪';
end case;
end;
call p12(); --repeat 循环
/*
repeat
sql statement;
sql statement;
until ciondition end repeat;
我感觉它好像for循环
*/
drop procedure p13;
create procedure p13(n int)
begin
declare i int default 0;
declare cott int default 0;
repeat
set cott :=cott+ i;
set i :=i+1;
until i> n end repeat;
select cott;
end;
call p13(3);

procrdure存储过程的更多相关文章

  1. 将表里的数据批量生成INSERT语句的存储过程 增强版

    将表里的数据批量生成INSERT语句的存储过程 增强版 有时候,我们需要将某个表里的数据全部或者根据查询条件导出来,迁移到另一个相同结构的库中 目前SQL Server里面是没有相关的工具根据查询条件 ...

  2. Dapper逆天入门~强类型,动态类型,多映射,多返回值,增删改查+存储过程+事物案例演示

    Dapper的牛逼就不扯蛋了,答应群友做个入门Demo的,现有园友需要,那么公开分享一下: 完整Demo:http://pan.baidu.com/s/1i3TcEzj 注 意 事 项:http:// ...

  3. MySQL主从环境下存储过程,函数,触发器,事件的复制情况

    下面,主要是验证在MySQL主从复制环境下,存储过程,函数,触发器,事件的复制情况,这些确实会让人混淆. 首先,创建一张测试表 mysql),age int); Query OK, rows affe ...

  4. mysql进阶之存储过程

    往往看别人的代码会有这样的感慨: 看不懂 理还乱 是离愁 别是一番滋味在心头 为什么要使用存储过程? 在mysql开发中使用存储过程的理由: 当希望在不同的应用程序或平台上执行相同的函数,或者封装特定 ...

  5. MySQL 系列(三)你不知道的 视图、触发器、存储过程、函数、事务、索引、语句

    第一篇:MySQL 系列(一) 生产标准线上环境安装配置案例及棘手问题解决 第二篇:MySQL 系列(二) 你不知道的数据库操作 第三篇:MySQL 系列(三)你不知道的 视图.触发器.存储过程.函数 ...

  6. 参数探测(Parameter Sniffing)影响存储过程执行效率解决方案

    如果SQL query中有参数,SQL Server 会创建一个参数嗅探进程以提高执行性能.该计划通常是最好的并被保存以重复利用.只是偶尔,不会选择最优的执行计划而影响执行效率. SQL Server ...

  7. MSSQL 事务,视图,索引,存储过程,触发器

    事务 事务是一种机制.是一种操作序列,它包含了一组数据库操作命令,这组命令要么全部执行,要么全部不执行. 在数据库系统上执行并发操作时事务是作为最小的控制单元来使用的.这特别适用于多用户同时操作的数据 ...

  8. Mysql - 存储过程/自定义函数

    在数据库操作中, 尤其是碰到一些复杂一些的系统, 不可避免的, 会用到函数/自定义函数, 或者存储过程. 实际项目中, 自定义函数和存储过程是越少越好, 因为这个东西多了, 也是一个非常难以维护的地方 ...

  9. SQL Server存储过程

    创建于2016-12-24 16:12:19 存储过程 概念: 1.存储过程是在数据库管理系统中保存的.预先编译的.能实现某种功能的SQL程序,它是数据库应用中运用比较广泛的 一种数据对象. 2.存储 ...

随机推荐

  1. Linux查看本机登陆用户信息(w、who、last和lastlog命令)

    w 命令 查看 Linux 服务器上目前已经登录的用户信息 [root@localhost ~]# w :: up :, users, load average:0.00, 0.00, 0.00 US ...

  2. node异步流程控制async

    1.串行无关联:async.series(tasks,callback); 多个函数依次执行,之间没有数据交换,其中一个函数出错,后续函数不再执行 async.series({ one: functi ...

  3. STM32-串行SPI nor

    源:FLASH 存储学习-串行SPI nor 1.1 SST25VF080B简介1.1.1 主要特性 关键点:容量.速度(时钟速度.读写速度).功耗. l 容量:8MBit: l 最高SPI时钟频率: ...

  4. Git与TortoiseGit使用方法

               下载这两个工具 Git地址:https://git-for-windows.github.io/ TortoiseGit地址:http://tortoisegit.org/ 点击 ...

  5. 深入学习js之——词法作用域和动态作用域

    开篇 当我们在开始学习任何一门语言的时候,都会接触到变量的概念,变量的出现其实是为了解决一个问题,为的是存储某些值,进而,存储某些值的目的是为了在之后对这个值进行访问或者修改,正是这种存储和访问变量的 ...

  6. 20145314郑凯杰 《Java程序设计》实验五 实验报告

    20145314郑凯杰 <Java程序设计>实验五 实验报告 实验搭档王亦徐:http://www.cnblogs.com/1152wyx/p/5471524.html 实验要求 完成实验 ...

  7. MR案例:Reduce-Join

    问题描述:两种类型输入文件:address(地址)和company(公司)进行一对多的关联查询,得到地址名(例如:Beijing)与公司名(例如:Beijing JD.Beijing Red Star ...

  8. KALI LINUX系统初始化配置

    1.Kali Linux安装VirtualBox增强功能 VirtualBox增强功能介绍:物理机与虚拟机之间的文件共享.物理机与虚拟机之间的剪切板共享.虚拟机的direct3D支持,这样虚拟机窗口就 ...

  9. [BZOJ1722]Milk Team Select 产奶比赛

    Description Farmer John's N (1 <= N <= 500) cows are trying to select the milking team for the ...

  10. prometheus statsd 监控

    Prometheus是一套开源的监控&报警&时间序列数据库的组合,起始是由SoundCloud公司开发的.随着发展,越来越多公司和组织接受采用Prometheus,社会也十分活跃,他们 ...