1.存储过程相当于我们学的各种高级语言的函数,既然是函数就可能有参数,先介绍参数类型:

存储过程主要包含三种参数类型,注意我说的不是数据类型(INT、VARCHAR)

第一种:IN输入参数:表示这种参数类型的值就必须由外界调用存储过程时赋值,就意味着你在调用的时候必须传入参数,但是像是高级语言的里的局部变量,当存储过程使用完毕的时候,IN类型的值随着消失了

DELIMITER$$
CREATE PROCEDURE demo(IN p_in int)
BEGIN
SELECT p_in;
SET p_in=2;
SELECT p_in;
END$$

DELIMITER;

SET @P_IN=1;

CALL demo(@P_IN)

select @P_OUT;  P_OUT是1!!! 值并没有发生改变

ps:DELIMITER 是指定什么是结束符,正常情况下,我们的SQL语句的结束符是  ;,但是存储过程的声明时,这个“函数”中的语句也需要 ;来表示结束,所以为了以防产生二义性,像我写的那样,此时 $$ 就相当于结束符 ;

第二种:OUT输出参数:依我看就是省去传参的时候的赋值操作,但却改变了传进来的的值(像是C语言的指针赋值),说起来似乎有些矛盾,但是却事实存在,直接上代码。
DELIMITER
CREATE PROCEDURE demo_out(OUT p_out int)
BEGIN
SELECT p_out;   p_out 为 null!!!!
SET p_out=2;
SELECT p_out;   p_out 为2!!!!
END;
DELIMITER;

SET @P_OUT=9;

CALL demo_out(@P_OUT)

select @P_OUT;  P_OUT是2!!!

第三种:INOUT函数,简单明了不用多说,就是传值并且改变值

DELIMITER
CREATE PROCEDURE demo_inout(INOUT p_inout int)
BEGIN
SELECT p_inout;
SET p_inout=2;
SELECT p_inout;
END;
DELIMITER;
SET @p_inout=1;
CALL demo_inout(@p_inout)

ps:

存储过程中的变量声明  declare 变量名字  变量的数据类型;

声明的方式也有两种,第一种是用select,第二种是使用SET语句;for example:

select 'Hello world' into @x;
SET @y='Goodbye Cruel world'
如果你的存储过程只有一行的时候,那么你完全可以省略那些BEGIN 或者END

FOR EXAMPLE:

CREATE PROCEDURE GreetWorld( ) SELECT CONCAT(@greeting,' World');  
SET @greeting='Hello';
CALL GreetWorld( );

CREATE PROCEDURE p1()   SET @last_procedure='p1';
CREATE PROCEDURE p2() SELECT CONCAT('Last procedure was ',@last_procedure);
CALL p1( );
CALL p2( );

2,存储过程中常用的各种语法与结构:
if_then_else语句

1.  mysql > DELIMITER   
2.  mysql > CREATE PROCEDURE proc2(IN parameter int)  
3.       -> begin
4.       -> declare var int;  
5.       -> set var=parameter+1;  
6.       -> if var=0 then
7.       -> select var;  
8.       -> end if;  
9.       -> if parameter=0 then
10.     ->   set parameter=100;
11.     -> else
12.     -> set parameter=0;  
13.     -> end if;  
14.     -> end;  
15.     -> //  
16.mysql > DELIMITER ;  
大致两种结构
if (condition) then (注意then之后没有;)
sql_stetament;
end if;

if(condition) then
sql_statement
else
sql_statement
end if;

CASE 语句
、1.  mysql > DELIMITER
2.  mysql > CREATE PROCEDURE proc3 (in parameter int)  
3.       -> begin
4.       -> declare var int;  
5.       -> set var=parameter+1;  
6.       -> case var  
7.       -> when 0 then   
8.       -> insert into t values(17);  
9.       -> when 1 then   
10.     -> insert into t values(18);  
11.     -> else   
12.     -> insert into t values(19);  
13.     -> end case;  
14.     -> end;  
15.     -> //  
16.mysql > DELIMITER ;
总结了下结构:
case NUMBER
when number then
SQL_Statement;
when anotherNUMber then
SQL_Statement;
else
SQL_Statement;
end ease;

while语句
1.  mysql > DELIMITER //  
2.  mysql > CREATE PROCEDURE proc4()  
3.       -> begin
4.       -> declare var int;  
5.       -> set var=0;  
6.       -> while var<6 do  
7.       -> insert into t values(var);  
8.       -> set var=var+1;  
9.       -> end while;  
10.     -> end;  
11.     -> //  
12.mysql > DELIMITER ;
大致结构
while (condition) do
SQL_statement/SET_Statement
end while;

repeat语句:

与do-while循环很相似,先执行一次,然后由Until验证条件

  mysql > DELIMITER //
2. mysql > CREATE PROCEDURE proc5 ()
3. -> begin
4. -> declare v int;
5. -> set v=0;
6. -> repeat
7. -> insert into t values(v);
8. -> set v=v+1;
9. -> until v>=5
10. -> end repeat;
11. -> end;
12. -> //
13.mysql > DELIMITER ;

(哈哈哈,复制一段,懒得敲了)
repeat
SQL_statement/SET_Statement
until (Condition)     
end repeat;

loop语句:开始学的时候就这个最变扭
1.  mysql > DELIMITER //  
2.  mysql > CREATE PROCEDURE proc6 ()  
3.       -> begin
4.       -> declare v int;  
5.       -> set v=0;  
6.       -> LOOP_LABLE:loop   LOOP_LABLE:标号,可以用在合法的语句前,便于结束(leave)循环
7.       -> insert into t values(v);  
8.       -> set v=v+1;  
9.       -> if v >=5 then
10.     -> leave LOOP_LABLE;   leave跳出由LOOP_LABEL指定的loop循环  
11.     -> end if;  
12.     -> end loop;  
13.     -> end;  
14.     -> //

leave--break、ITERATE--continue
再复制一段,哈哈哈
 DELIMITER $$
 DROP PROCEDURE IF EXISTS LOOPLoopProc$$
 CREATE PROCEDURE LOOPLoopProc()
       BEGIN
               DECLARE x  INT;
               DECLARE str  VARCHAR(255);
               SET x = 1;
               SET str =  '';
               loop_label:  LOOP
                           IF  x > 10 THEN
                               LEAVE  loop_label; mysql 大多数是不区分大小写的,除了你在查询的时候使用DISTINCT
                           END  IF;
                           SET  x = x + 1;
                           IF  (x mod 2) THEN
                               ITERATE  loop_label; ITERATE  类似于高级语言中的continue语言,返回外层循环并且开始下一个
                           ELSE
                               SET  str = CONCAT(str,x,',');
                           END  IF;

END LOOP;    
               SELECT str;
       END$$
 DELIMITER ;

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

  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. redux middleware 源码分析

    原文链接 middleware 的由来 在业务中需要打印每一个 action 信息来调试,又或者希望 dispatch 或 reducer 拥有异步请求的功能.面对这些场景时,一个个修改 dispat ...

  2. UVA129

    坑点在于输出格式. 四个字母一个空格,行末没有空格,64个字母换行重新打印. AC代码 #include<cstdio> const int maxn=200; int cnt; int ...

  3. Mybatis入门1

    关于Mybatis的快速入门可以分为这样几步: 1.引入依赖或者引入jar包 2.编写全局配置文件(Mybatis-config.xml) <?xml version="1.0&quo ...

  4. java-数据库连接,分层实现增删改查测试

    成员属性类: public class Dog { private int number; private String name; private String strain; private St ...

  5. java 集合框架(二)Iterable接口

    Iterable接口是java 集合框架的顶级接口,实现此接口使集合对象可以通过迭代器遍历自身元素,我们可以看下它的成员方法 修饰符和返回值 方法名 描述 Iterator<T> iter ...

  6. 微信 Tinker 的一切都在这里,包括源码

    最近半年以来,Android热补丁技术热潮继续爆发,各大公司相继推出自己的开源框架.Tinker在最近也顺利完成了公司的审核,并非常荣幸的成为github.com/Tencent上第一个正式公开的项目 ...

  7. Jenkins构建Android项目持续集成之findbugs的使用

    Findbugs简介 关于findbugs的介绍,可以自行百度下,这里贴下百度百科的介绍.findbugs是一个静态分析工具,它检查类或者 JAR 文件,将字节码与一组缺陷模式进行对比以发现可能的问题 ...

  8. Java和Flex整合报错(二)

    1.错误原因 usage: java org.apache.catalina.startup.Catalina [ -config {pathname} ] [ -nonaming ] { -help ...

  9. html标签自带样式总结

    一.html标签自带样式 head { display:none; } body { margin:8px; line-height:1.12; } button, textarea, input, ...

  10. Django学习-16-Session

    1.保存在服务器的键值对           2.Session做验证时,还要依赖Cookie(重要).当用户登录成功时,生成随机字符串,一份放到Session,一份放到Cookie.当用户再次登录, ...