zoukankan      html  css  js  c++  java
  • MySql学习笔记——存储过程

    今天复习了一下mysql的一些知识,之前学习的时候是看视频,但是没有做什么笔记,所以现在通过看书把以前学习的回顾一下,加深一下印象。

    存储过程定义

    简单的来说,可以定义一段程序放在数据库中,这样的程序称为存储过程,它是最重要的数据库对象之一。存储过程实质上就是一段代码,可以由声明式SQL语句(如create,update和select等)和过程式SQL语句(如if-then-else)组成。

    存储过程的优点

    • 存储过程在服务器端运行,执行速度快。
    • 存储过程执行一次后,其执行规划就驻留在高速缓冲存储器,在以后的操作中,只需要从高速缓冲存储器中调用已编译好二进制代码执行,提高系统性能。
    • 确保数据安全。使用存储过程可以完成所有数据库操作,并可通过编程方式控制上述操作对数据库信息访问的权限。

    存储过程的创建、调用、删除和修改

    1.创建存储过程

    语法:

    create procedure sp_name ([proc_parameter[,....]])
        [characteristic...] routine_body
    

    其中,proc_parameter的参数如下:

    [ in | out | inout] param_name type
    

    说明:

    • sp_name: 存储过程的名称,默认在当前数据库中创建。若要在特定的数据库中创建,要在名称前面加上数据库的名称,格式为:db_name.sp_name。名称要尽量避免与MYSQL的内置函数相同,否则会发生错误。
    • proc_parameter:存储过程的参数。
    • param_name为参数名,
    • type为参数的类型,有多个参数时用逗号隔开。MySql的存储过程支持三种类型的参数:输入参数、输出参数和输入/输出参数,关键字分别是IN、OUT和INOUT。输入参数使数据可以传递给一个存储过程。当需要一个答案或结果的时候,可以使用输出参数。输入输出两者都可以充当。

    例子:

    delimiter $$
     create PROCEDURE delete_user(in us int(10))
    begin 
     DECLARE num int(4);
     set num = us - 1;
     delete from user where id = us;
    end $$
    delimiter;
    

    其中delimiter $$是用户定义的结束符,通常这个符号可以是一些特殊的符号,如两个“#”,两个“¥”等。使用delimiter命令时,应该尽量避免使用反斜杠(“/”)字符,因为那是Mysql的转义字符。

    过程体

    在存储过程体中可以使用所有的sql语句类型,包括所有的DDL、DCL和DML语句。
    1.局部变量
    语法:

    declare var_name[,...] type [default value]
    

    例子:

    declare num int(4);
                declare str,str2 varchar(6);
    

    局部变量和用户变量的区别在于:局部变量前面没有使用@符号,局部变量在其所在的begin..end语句块处理完就消失了,而用户变量存在于整个会话当中。
    2.使用SET语句赋值
    要给局部变量赋值可以使用SET语句。语法如下

    SET var_name = expr [,var_name = expr]……
    set num = 1, str = 'hello';
    

    3.select...into语句
    使用这个语句可以把选定的列值直接存储到变量中。因此返回的结果只能有一行。
    语法:

    select col_name[,...] into var_name[,...] table_expr
    

    说明:

    • col_name是列名。
    • var_name是要赋值的变量名。
    • table_expr是select语句中的from子句及后面的部分。
      该语句只能在存储过程体中使用。

    4.流程控制语句
    在MySql中,常见的过程式SQL语句可以用在一个存储过程体中。如:IF语句、CASE语句、LOOP语句、WHILE语句、ITERATE语句和LEAVE语句

    IF语句
    IF-THEN-ELSE语句可以根据不同的条件执行不同的操作。
    语法:

    IF search_condition THEN statement_list
    [ELSEIF search_condition THEN statement_list]...
    [ELSE statement_list]
    END IF
    

    说明:

    • search_condition是判断条件。
    • statement_list中包含一个或多个sql语句。当search_condition的条件为真时,就执行相应的sql语句。

    例子:

    delimiter $$
    create procedure compar(in k1 integer, in k2 integer, out k3 char(6))
    BEGIN
     if k1>k2 THEN 
    		set k3 = '大于';
     elseif k1=k2 then 
    		set k3 = '等于';
     else 
    	set k3 = '小于';
     end if;
    end $$
    delimiter;
    

    CASE语句
    语法:

    CASE case_value
                WHEN when_value THEN statement_list
                [ WHEN when_value THEN statement_list]...
                [ ELSE statement_list]
    END CASE
    

    一个case语句经常可以充当一个IF-THEN-ELSE语句。
    例子:

    delimiter $$
    create procedure abc(in str varchar(4), out sex varchar(4))
     begin 
    	case str 
    				when 'm' then set sex = '男';
    				when 'f' then set sex = '女';
    				else set sex = '无';
     end case;
     end $$
    delimiter ;
    

    循环语句
    MySql支持3条用来创建循环的语句:WHILE、REPEAT和LOOP语句,在存储过程中可以定义0个、1个或多个循环语句。
    WHILE语句语法为:

    [begin_label: ]
    WHILE search_condition DO
        statement_list
    END WHILE [end_label]
    

    说明:理解这些语句可以通过java中的知识理解。
    例子:

    delimiter $$
    create procedure dowhile()
    begin 
    		declare v1 in default 5;
    		while v1 > 0 do 
    					set v1 = v1-1;
    		end while;
    end $$
    delimiter ;
    

    REPEAT语句语法如下:

    [begin_label: ]
    REPEAT
        statement_list
        UNTIL search_condition
    END REPEAT [end_label]
    

    说明:REPEAT语句首先执行statement_list中的语句,然后判断search_condition是否为真,为真则停止循环,不为真则继续循环。
    例子:

     repeat
        v1=v1-1;
        until v1<1;
    end repeat;
    

    repeat和while语句的区别在于:REPEAT先执行语句,后进行判断;而WHILE是先判断条件为真时才执行语句。

    LOOP语句语法如下:

    [begin_label: ]
    LOOP
            statement_list
    END LOOP [end_label]
    

    说明:LOOP允许某特定语句或语句群的重复执行,实现一个简单的循环构造,statement_list是需要重复执行的语句。在循环体内的语句一直重复至循环被退出,退出时通常伴随着一个LEAVE语句。
    LEAVE语句经常和BEGIN...END或循环一起使用,结构如下:

    LEAVE label
    

    例子:

    delimiter $$
    create procedure doloop()
    begin 
       set @a=10;
    	 label: loop 
    				set @a=@a-1;
    				if @a<0 then 
    						leave label;
    				end if;
    	 end loop label;
    end $$
    delimiter ;
    

    存储过程的调用

    语法:

    call sp_name([parameter[,...]])
    

    例子:判断两个数的大小

    delimiter $$
    create procedure compar(in k1 integer, in k2 integer, out k3 char(6))
    BEGIN
     if k1>k2 THEN 
    		set k3 = '大于';
     elseif k1=k2 then 
    		set k3 = '等于';
     else 
    	set k3 = '小于';
     end if;
    end $$
    delimiter;
    call compar(4,4,@k3);
    select @k3;
    

    结果

    存储过程的删除

    语法:

    drop procedure [if exists] sp_name
    

    例子:

    drop procedure if exists compar;
    

    存储过程的修改

    修改存储过程可以用alter procedure语句。
    语法:

    alter procedure sp_name[characteristic...]   其中characteristic是存储过程创建时特征。
    

    小结

    主要把存储过程定义,创建、调用、修改和删除简单回顾一下,这块知识还是很重要的。

  • 相关阅读:
    VS2013编写的C#程序,在xp下会报错说“不是合法的win32程序”。
    能根据串口驱动来 确定com号
    javaweb工程,Servlet里面获取当前WEB跟路径的文件绝对路径地址
    import了sun开头的类,虽然它在代码里压根就没派上用处!但是必须得引用!
    页面关闭时触发的时间
    jquery设置元素的readonly和disabled
    ibatis CDATA
    form的submit与onsubmit的用法与区别
    C#操作AD及Exchange Server总结(一)
    AD如何用C#进行增删改、查询用户与OU
  • 原文地址:https://www.cnblogs.com/black-spike/p/7608185.html
Copyright © 2011-2022 走看看