mysql存储过程

    xiaoxiao2023-11-13  141

    基础流程、关键字:

    流程

    定义定界符

    创建存储过程

    存储过程开始

           过程体

    存储过程结束

    定义定界符

    通过call进行调用。

    关键字

    DELIMITER : 定义定界符(如:DELIMITER//),mysql默认是分号。

    CREATE PROCEDURE  : 创建存储过程(如:CREATE PROCEDURE test(in a int))

    DROP PROCEDURE IF EXISTS : 存储过程如果存在就进行删除(如DROP PROCEDURE IF EXISTS test//)

    BEGIN … … END// : 标识存储过程的开始与结束

    DECLARE : 定义变量(如:DECLARE num int;)

    @ : 定义全局变量,不需要进行定义,直接在前面加上@即可(如:SET @num=a+b;)

    SET : 给变量赋值 (如:SET num=a+b;)

     

    示例:

    DELIMITER//  -- 定义边界符

    DROP PROCEDURE IF EXISTS test//   -- 如果存在就进行删除

    CREATE PROCEDURE test(in a INT,in b INT)  -- 创建存储过程

    BEGIN  -- 过程体开始

    SET @num=a+b;  -- 进行赋值

    SELECT @num;  -- 进行输出

    END//   -- 过程体结束

    DELIMITER;   -- 将定界符修改为默认

    -- 调用

    CALL test(1,2);

     

    条件控制语句

    IF语句

    结构:

    If (判断条件)then

           …….

    Else

           ……

    End if;

    示例:

    DELIMITER//

    DROP PROCEDURE IF EXISTS test//

    CREATE PROCEDURE test(IN P_count INT)

    BEGIN

    IF p_count>10 THEN

           SELECT 'p_count大于十';

    ELSE

           SELECT 'p_count小于等于十';

    END IF;

    END//

    DELIMITER:

     

    CALL test(11);

    CASE语句

    结构:

    当var满足那个when就执行那个流程,如果都不满足就执行else

    Case var

    When 1 then

           ……

    When 2 then

           ……

    Else

           ……

    End case;

    示例:

    DELIMITER//

    DROP PROCEDURE IF EXISTS test//

    CREATE PROCEDURE test(IN var INT)

    BEGIN

    CASE var

    WHEN 1 THEN

           SELECT '星期一';

    WHEN 2 THEN

           SELECT '星期二';

    ELSE

           SELECT '其它';

    END CASE;

    END//

    DELIMITER;

     

    CALL test(2);

     

    While语句

    结构:

     

    当条件为flase时跳出循环

    While (判断条件) do

           ……

    End while;

    示例

    DELIMITER//

    DROP PROCEDURE IF EXISTS test//

    CREATE PROCEDURE test(IN var INT)

    BEGIN

    DECLARE str VARCHAR(255) DEFAULT 'HZY';

    WHILE var<10 DO

           SET str= CONCAT('I',' LOVE ','YOU ',str);

           SET var=var+1;

    END WHILE;

           SELECT str;

    END//

    DELIMITER;

     

    CALL test(9);

     

    Repeat语句

    它和while类似,区别在于,while是先检查在执行而repeat是先执行在检查,

    While是满足条件进行循环,而Repeat是满足条件退出循环。

     

    结构

    Repeat

           。。。。。。 -- 先执行在进行判断

    Until (判断条件)   -- 当达到此条件退出循环

    End Repeat;

    示例:

    DELIMITER//

    DROP PROCEDURE IF EXISTS test//

    CREATE PROCEDURE test(IN var INT)

    BEGIN

    REPEAT

           SELECT 'hello world!';

           SET var=var+1;

    UNTIL var > 10  -- 当达到此条件退出循环

    END REPEAT;

    END//

    DELIMITER;

     

    CALL test(11);

    LOOP语句

    直接进行循环,直到使用leave关键字标记了此次循环退出才会停止。

    结构:

    loop_test:lopp

           ……

    If (判断条件) then

           leave loop_ test;

    end if;

    end loop;

    示例:

    DELIMITER//

    DROP PROCEDURE IF EXISTS test//

    CREATE PROCEDURE test(IN var INT)

    BEGIN

    test_loop:LOOP

           SELECT 'hello world!';

           SET var=var+1;

    IF var > 10 THEN  -- 当满足条件后就会被标识退出

           LEAVE test_loop;

    END IF;

    END LOOP;

    END//

    DELIMITER;

     

    CALL test(9);

    游标

    流程

    1)定义游标结束标识

    2)定义游标

    3)将游标结束标识绑定到游标

    4)打开游标

    5)进行遍历取出游标中的多个值

    6)进行操作

    示例;

    DELIMITER//

    DROP PROCEDURE IF EXISTS test//

    CREATE PROCEDURE test()

    BEGIN

    -- 定义变量

    DECLARE username VARCHAR(30);

    DECLARE paw VARCHAR(20);

    -- 定义游标结束标识

    DECLARE next TINYINT default TRUE;

    -- 定义游标

    DECLARE user_list CURSOR FOR SELECT user_name,user_password FROM tb_user;

    -- 将游标结束标识绑定到游标

    DECLARE CONTINUE HANDLER FOR NOT FOUND SET next = FALSE;

    -- 打开游标

    OPEN user_list;

    -- 进行循环遍历游标

    WHILE next DO

           -- 取除游标中的多个值

           FETCH user_list INTO username,paw;

           SELECT CONCAT(username,'===',paw);

    END WHILE;

    END//

    DELIMITER;

     

    CALL test();

    最新回复(0)