zoukankan      html  css  js  c++  java
  • mysql 存储过程学习(总)

    #一。存储过程和存储函数的创建案例

    CREATE PROCEDURE myprocedure(in a int,in b int ,OUT c INT)
    BEGIN
    set c=a+b;
    end;

    call myprocedure(1,2,@num);#存储过程需要call 来执行 @num 这个是执行的结果,我们通过select 来调用

    SELECT @num;


    CREATE FUNCTION myfunction(a INT) RETURNS INT(2)#RETURNS 要返回的类型
    BEGIN
    set a=a+1;
    RETURN a;
    end;

    SELECT myfunction(2)+@num;

    #二。变量的使用
    #通用公式 :DECLARE 变量名称 变量类型 DEFAULT 默认值 (如果不写DEFAULT,则默认值为NULL)
    #给变量赋值用set 或者select ... into 变量名

    CREATE FUNCTION myfunction2(a INT) RETURNS INT(2)#RETURNS 要返回的类型
    BEGIN
    DECLARE b INT DEFAULT 100;
    set a=b+1;
    RETURN a;
    end;
    SELECT myfunction2(3);

    SELECT myfunction(2),+@num;

    CREATE FUNCTION myfunction3(a INT) RETURNS INT(2)
    BEGIN
    #相同的变量可以写在一起
    # b,c,d为局部变量
    DECLARE b,c,d INT DEFAULT 100;
    set a=b+c+d;
    RETURN a;
    end;
    SELECT myfunction3(2);
    #三。定义条件和处理程序

    #mysql 存储函数和过程可以将错误 变成我们想要的处理结果分2步骤

    #1.定义错误条件 语法:DECLARE 条件名字 CONDITION for 错误编码
    #2. 定义错误执行程序: DECLARE 类型(EXIT,CONTINUE)HANDLER for 条件名字 set @info='定义的含义';

    CREATE TABLE contest(s1 int,PRIMARY KEY(s1));

    CREATE PROCEDURE myprocedure2()
    BEGIN
    DECLARE myfirstcon CONDITION for 1062;
    DECLARE CONTINUE HANDLER for myfirstcon set @info='主键冲突';
    INSERT INTO contest VALUES(1);
    INSERT INTO contest VALUES(1);
    set @info='主键冲突1';
    end;

    call myprocedure2();
    SELECT @info
    # @info为用户变量

    #备注:

    -- 1. 局部变量:局部变量一般用在sql语句块中,比如存储过程的begin/end。
    --
    --   2. 用户变量:用户变量的作用域要比局部变量要广。用户变量可以作用于当前整个连接,但是当当前连接断开后,其所定义的用户变量都会消失。
    --
    --   3. 会话变量:服务器为每个连接的客户端维护一系列会话变量。(SET @num=1; #设置一个变量等于1 SELECT @num; #查询该变量)
    --
    --   4. 全局变量:全局变量影响服务器整体操作。当服务器启动时,它将所有全局变量初始化为默认值(可以通过@@或global来操作系统变量)


    #四。光标的使用

    #声明光标 语法:DECLARE 光标名字 CURSOR FOR sql语句

    #打开光标 OPEN 光标名称

    #使用光标 FETCH 光标名称 into 。。。

    #关闭光标 CLOSE 光标名称

    CREATE PROCEDURE guangbiao()
    BEGIN
    DECLARE a VARCHAR(20);
    DECLARE c VARCHAR(20);
    DECLARE b int DEFAULT 0;
    DECLARE myguangbiao CURSOR for SELECT title,body from 测试.articless;
    DECLARE CONTINUE HANDLER for not FOUND set b=1;
    OPEN myguangbiao;

    read_loop:
    LOOP
    FETCH myguangbiao into a,c;
    IF b=1 THEN
    LEAVE read_loop;
    end IF;
    INSERT into 测试.aaa(text1,text) VALUES(a,c);
    set b=0;
    END LOOP read_loop;
    CLOSE myguangbiao;
    END;

    call guangbiao();


    #五。流程控制的使用

    #1.IF 使用

    create PROCEDURE iftest1()
    BEGIN
    DECLARE a int DEFAULT 10;
    -- IF (a>1 &&a<20) THEN
    IF (a>1 and a<20) THEN
    SELECT 'ok';
    ELSE SELECT 'No';
    END IF;
    END;
    CALL iftest();

    #2.case 使用

    create PROCEDURE casetest()
    BEGIN
    DECLARE a int DEFAULT 10;
    CASE a
    WHEN a>10 then SELECT 'no';
    WHEN 10 then SELECT 'ok';
    ELSE SELECT 'nono';
    end CASE;
    END;
    CALL casetest();
    #3.loop 使用

    CREATE PROCEDURE looptest()
    BEGIN
    DECLARE a int DEFAULT 0;
    DECLARE b int DEFAULT 0;
    my_loop:LOOP
    set a=a+1;
    if a>10 THEN LEAVE my_loop;
    END if;
    set b=a;

    END LOOP my_loop;
    SELECT b;

    end;

    CALL looptest();

    #4.LEAVE 使用 跳出当前循环见上个测试用例 looptest相当于java循环中的break

    #5.ITERATE 使用,跳转到循环头部执行,相当于java循环中的continue,ITERATE只能 使用在循环中


    CREATE PROCEDURE ITERATEtest()
    BEGIN
    DECLARE a int DEFAULT 0;
    DECLARE b int DEFAULT 0;
    my_loop:LOOP
    set a=a+1;
    if a>10 THEN LEAVE my_loop;
    ELSEIF a>5 THEN ITERATE my_loop;
    END if;
    set b=a;

    END LOOP my_loop;
    SELECT b;

    end;

    CALL ITERATEtest();

    #6.REPEAT 带条件的循环

    CREATE PROCEDURE REPEATtest()
    BEGIN
    DECLARE a int DEFAULT 0;
    REPEAT
    set a=a+1;
    UNTIL a>10
    END REPEAT;
    SELECT a;
    END;

    CALL REPEATtest();
    #7.WHILE 带条件的循环

    CREATE PROCEDURE WHILEtest()
    BEGIN
    DECLARE a int DEFAULT 0;

    WHILE a<10 DO
    set a=a+1;
    END WHILE;
    SELECT a;

    END;

    CALL WHILEtest()

    #查看存储过程和函数 状态和信息

    show PROCEDURE STATUS like 'casetest%';
    show CREATE FUNCTION 测试.myfunction;
    show CREATE PROCEDURE 测试.casetest;


  • 相关阅读:
    归并排序的java实现
    Hanoi问题java解法
    j2ee之Filter使用实例(页面跳转)
    java工具类之Graphics
    java程序设计之循环链表
    Java程序设计求出岁数
    Java程序设计之链表结构
    CENTOS 6 通过YUM升级GCC到4.7/4.8
    Object c的NSString的使用,创建,拼接和分隔,子string,substring
    Let’s Encrypt 最近很火的免费SSL 使用教程
  • 原文地址:https://www.cnblogs.com/anxbb/p/9244903.html
Copyright © 2011-2022 走看看