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实现 蓝桥杯VIP 算法训练 校门外的树
    Java实现 蓝桥杯VIP 算法训练 统计单词个数
    Java实现 蓝桥杯VIP 算法训练 统计单词个数
    Java实现 蓝桥杯VIP 算法训练 开心的金明
    Java实现 蓝桥杯VIP 算法训练 开心的金明
    Java实现 蓝桥杯 算法训练 纪念品分组
    Java实现 蓝桥杯 算法训练 纪念品分组
    Java实现 蓝桥杯VIP 算法训练 校门外的树
    Java实现 蓝桥杯VIP 算法训练 统计单词个数
    Java实现 蓝桥杯VIP 算法训练 开心的金明
  • 原文地址:https://www.cnblogs.com/anxbb/p/9244903.html
Copyright © 2011-2022 走看看