阅读背景:

mysql学习笔记之十二(存储过程和函数)

来源:互联网 

     存储进程和函数,一种数据库对象,用来实现将一组关于表操作的SQL语句代码当作一个整体来履行,也是与数据库对象表关联最紧密的数据库对象。在数据库体系中,当调用存储进程和函数时,则会履行这些对象中所设置的sql语句组从而实现相应的功效。

一、存储进程和函数的相干概念

    针对表的一个完全操作常常不是单条sql语句便可以够实现,而是须要一组sql语句来实现。
    例:
        为了购置商品的定单处置:
        (1)在生成定单之前,首先须要查看商品库存中是不是有相应的商品
        (2)如果库存中存在相应的商品,按着须要预定商品以便不将该商品卖给他人,并且删除库存数目以反应准确的库存量。
        (3)如果商品库存中不存在相应的商品,就须要向供给商定货。
    在具体应用中,一个完全的操作会包括多条sql语句,在履行进程中须要依据前面sql语句的履行成果有选择的履行后面的sql。为懂得决该问题,mysql供给了数据库对象存储进程和函数。

    存储进程和函数实际上就是事前经过编译并存储在数据库夅的一段sql语句聚集。


二、存储进程根本操作

    创立
        create procedure procedure_name([procedure_paramiter[,...]])    
            [characteristic...] routine_body

        procedure_name:存储进程名称
        procedure_paramter:存储进程参数
        characteristic:存储进程特征
        routine_body:存储进程的sql语法代码,可以应用begin...end来标记sql语句的开端和停止
        注意:推重的进程命名为procedure_xxx或proce_xxx;

        procedure_paramter中每一个参数的语法情势:
            [IN|OUT|INOUT] paramter_name type
        上述语句:每一个参数有3部份组成,分离为输入输出类型,参数名,参数类型。

        characteristic的取值:
            LANGUAGE SQL                    
            |[NOT] DETERMINISTIC
            |{CONTAINS SQL|NO SQL|READS SQL DATA|MODIFIES SQL DATA}
            |SQL SECURITY {DEFINER|INVOKER}
            |COMMENT "string"

        language sql :
                存储进程的routine_body部份由sql语句组成。为mysql所默许的语句
        [not]deterministic :
                表现存储进程的履行成果是不是肯定。deterministic表现履行成果是肯定的,即每次履行存储进程时,如果输入雷同的参数将得到雷同的输出;not deterministic,履行成果不肯定,即雷同的输入可能得到不同的输出,默许值为deterministic。
        {contains sql|no sql|reads sql data|modifies sql data}:
            contains sql : 包括sql语句
            no sql :不包括sql
            reads sql data:包括读数据的语句
            modifies sql data:包括写数据的语句
            默以为contains sql
        sql security {definer|invoke}
            设置谁又权限来履行,如果值为definer,表现只有定义者自己能力够履行;如果值为invoker表现调用着可以履行。默以为definer
        comment "string"
            表现注释语句

        例:创立查询所有雇员工资的存储进程。
            delimiter $$
					create procedure proce_employee_sale()
					comment "查询所有雇员的工资"
					begin
						select sale from t_employee;
					end 
				$$
            delimiter;  

    查看
        show procedure status \G
        show create  procedure proce_name\G
    修正
        alter procedure procedure_name
            [characteristic...]
        修正时characteristic的取值为
            |{CONTAINS SQL|NO SQL|READS SQL DATA|MODIFIES SQL DATA}
            |SQL SECURITY {DEFINER|INVOKER}
            |COMMENT "string"
    删除
        drop procedure proce_name

三、函数的根本操作

    创立
        create function function_name([function_paramter[,...]])
            [characteristic...] routine_body
            routine_body 可以应用begin_end来标记sql语句的开端和停止
        例:创立某个雇员工资的函数
            delimiter $$
					create function func_employee_sale(empno int)
						returns double(10,2)
					comment "查询某个雇员的工作"
						begin
							return (
								select sale from t_employee where t_employee.empno=empno
							);
						end
				$$
            delimiter ;
    查看
        show function status\G
        show create function func_name\G
    修正
        alter function function_name
            [characteristic...]
        修正时characteristic的取值为
            |{CONTAINS SQL|NO SQL|READS SQL DATA|MODIFIES SQL DATA}
            |SQL SECURITY {DEFINER|INVOKER}
            |COMMENT "string"   
    删除
        drop function func_name

四、存储进程和函数的表达式

    操作变量

        声明变量
            declare var_name[,...] type [default value]
            不指定default则为null
            例:
                declare employee_sale int default 1000

        赋值变量
            set var_name=expr[,...]
            expr是关于变量的赋值表达式
            select field_name[,...] into var_name[,...]
                from table_name
                    where condition
            应用查询成果给参数赋值
            注意:当将查询成果赋值给变量,该查询语句的返回成果只能是单行。
            例:
                declare employee_sale int default 1000
                set employee_sale=3500;

                select sale into employee_sale
                    from t_employee
                        where empno=7566;

    操作条件

        定义条件
            通过declare来定义
            declare condition_name condition for condition_value
                condition_value:
                    sqlstate[value] sqlstate_value|mysql_error_code
            condition_name 表现所要定义的条件名称
            condition_value 用来实现设置条件的类型
            sqlstate_value  和mysql_error_code :用来设置条件的毛病

        定义处置程序
            declare handler_type handler for condition_value[,...] sp_statement
            handler_type:
                continue
                |exit
                |undo
            condition_value:
                sqlstate[value] sqlstate_value
                |condition_name
                |sqlwarning
                |not found
                |sqlexception
                |mysql_error_code
    应用光标
        声明光标

            declare cursor_name cursor for select_statement;

        打开光标

            open cursor_name

        应用光标

            fetch cursor_name into var_name [,var_name]...

        关闭光标

            close cursor_name
        例:
            declare cursor_employee cursor for select sale from t_employee; 
            open cursor_employee
            fetch cursor_employee into employee_sale;
            close cursor_employee

        注意:
            在具体应用光标时,光标必需在处置程序之前且在变量和条件以后声明,并且最后必定要关闭光标。

    应用流程掌握

        条件掌握
            通过if,case来实现条件掌握语句,if语句具体进行条件掌握时,依据是不是满足条件,履行不同的语句;而对case语句则可以实现更庞杂的条件掌握。

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

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


        重复掌握

            [begin_label:] 
                LOOP
                    statement_list
                END LOOP 
            [end_label]

            begin_label和end_label分离表现重复开端和停止,这两个标记必需雷同,并且可以省略

            对重复语句,如果想退出正在履行的重复体,可以应用症结字leave
                LEAVE label

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

            [begin_label:]
                REPEAT search_condition DO
                    statement_list
                END REPEAT

    通过上述介绍,懂得了存储进程和函数的概念和定义,但是对存储进程和函数的具体应用还是模隐约糊的。

    存储进程和函数的区分:函数必需有返回值,而存储进程没有。存储进程的参数类型远远多于函数参数类型。

    存储进程和函数的优缺陷。

    长处:     
        1、存储进程和函数许可尺度组件式编程,进步了sql语句的重用性,同享性,和可移植性
        2、存储进程和函数能够实现较快的履行速度,能够减少网络流量
        3、存储进程和函数可以被作为一种安全机制来应用
    缺陷:
        1、存储进程和函数的编写比单条sql语句庞杂,须要用户具有更高的技巧和更庞杂的经验
        2、在编写存储进程和函数时,须要创立这些数据库对象的权限
     存储进程和函数,一种数据库对象,用来实现将一组关于表操作的SQL语句代码当作一个整体来履行




你的当前访问异常,请进行认证后继续阅读剩余内容。

分享到: