Mysql 存储过程

it2022-05-09  38

1、理解:        把若干条 SQL 语句封装起来,起个名字,就叫过程        把这个过程存储在数据库中,就叫存储过程2、存储过程的创建语法:        create procedure procedureName()        begin            --sql 语句        end$3、查看已有的存储过程:        示例:show procedure status;        4、调用存储过程:        示例: call procedureName ();        5、存储过程是可以编程的,意味着可以使用 变量 表达式 控制结构来完成复杂的功能    1、声明变量关键词:declare          格式: declare 变量名 变量类型  [default 默认值]         实例:                     create procedure p2()                    begin                        declare age int default 18;                        declare height int default 180;                                                select concat('年龄',age,'身高',height) from dual;                    end$    2、变量运算和赋值:        1、赋值: set 变量名 := 1               示例:create procedure p2()                        begin                            declare age int default 18;                            declare height int default 180;                                set age := age + 20;                            select concat('20年后的年龄', age ,'身高' , height) from goods;                        end$        2、如何给存储过程传参数            解释:存储过程的括号里面,可以声明参数            语法:[in / out / inout] 参数名 参数类型            示例:                    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$        3、控制结构:            1、顺序            2、分支/选择                1、case:                        create procedure p6(in n int)                        begin                            declare total int default 0;                                set toral := floor(5 * rand());  #取整                                    case total                                        when 1                                             then select 'nihao';                                        when 2                                             then select  'hello';                                        else                                            select 'hi';                                    end case;                        end$                                        3、循环:                1、while:                        create procedure p6(in n int)                        begin                            declare total int default 0;                            declare  num int default 0;                                while num < n                                do                                    set num := num + 1;                                    set total := total + num;                                end while;                            select total;                        end$                                2、repeat: 循环                        create procedure w()                        begin                            declare w int default 0;                            declare e int default 0;                                repeat                                    set w := w + 1;                                    set e := w + e;                                until w  >= 100  end repeat;                                select e;                                                                           end;    3、cursor 游标:        1、解释:1条 SQL ,对应N条结果集资源,取出资源的接口/句柄,就是游标                        取值:取出一次,向后进1格,当没数据时,报错 02000        2、构成:            1、声明:declare 游标名 cursor select语句            2、打开:open 游标名            3、取值:fetch 游标名 into var ...;            4、关闭:close 游标名                3、游标取值越界时,有没有标识?利用标识来结束(触发)            1、:在 Mysql cursor 中,可以用 declare continue handler / declare exit handler 来操作一个标识符                        语法:declare exit handler for NOT FOUND set  var :=  0;                        2、:continue 和 exit 和 undo 的区别:                    1、exit          :触发后,后面的语句不再执行                    2、continue  :触发后,后面的语句会继续执行                    3、undo          :触发后,前面的语句撤销(但是呢,Mysql 目前还不支持 undo)                                      4、示例:            1、逻辑上不够严明,如果第一行就为空,会怎么样                    create procedure q()                        begin                            declare w int ;                            declare q int ;                            declare e varchar(20) ;                                         declare var int default 1;                                declare getgoods cursor for select gid, num, name from goods;                                    declare exit handler for NOT FOUND set var := 0;                                    #如果这里不是 exit 而是 continue ,那么最后一行会被多执行一次 select                                open getgoods;                                    repeat                                        fetch getgoods into w, q, e;                                        select w, q, e;                                    until var = 0 end repeat;                                close getgoods;                        end$            2、第2种,在逻辑上要正确一些:                    create procedure q()                        begin                            declare w int ;                            declare q int ;                            declare e varchar(20) ;                                         declare var int default 1;                                declare getgoods cursor for select gid, num, name from goods ;                                    declare continue handler for NOT FOUND set var := 0;                                open getgoods;                                    fetch getgoods into w, q, e;                                    while var = 1                                          do                                            select w, q, e;                                            fetch getgoods into w, q, e;                                    end while;                                close getgoods;                        end$                        

转载于:https://www.cnblogs.com/yufangqing/p/3764996.html


最新回复(0)