zoukankan      html  css  js  c++  java
  • 存储过程和函数

      存储过程和函数是事先经过编译并存储在数据库中的一段SQL语句的集合,调用存储过程和函数可以简化开发人员的工作量,减少数据在数据库和应用服务器之间的传输,对提高数据处理效率有好处。存储过程和函数的区别在于函数必须有返回值,而存储过程没有;存储过程可以使用IN、OUT和INOUT类型,而函数的参数只能使用IN类型。

    创建、修改、删除存储过程或函数

       调用存储过程的语法如下:

      Mysql的存储过程和函数允许提交和回滚,但是不允许执行Load  data infile语句。如下创建存储过程的实例:

      存储过程的调用和直接执行SQL的功能是相同的,但是存储过程的好处是逻辑分装在数据库端,调用者不需要了解其中的逻辑,一旦处理逻辑发生改变,只需要修改存储过程即可。

      下面对characteristic进行说明:

    • LANGUAGE SQL:说明下面过程是使用SQL语言编写,系统默认。
    • [NOT]DETERMINISTIC:DETERMINISTIC确定的,即每次输入一样输出也一样。[NOT]DETERMINISTIC:非确定的。
    • {CONTAINS SQL|NO SQL|READS SQL DATA|MODIFIES SQL DATA}:CONTAINS SQL:表示子程序不包含读写数据的语句;NO SQL:表示子程序不包含SQL语句;READS SQL DATA:表示子程序包含读数据的语句;MODIFIES SQL DATA:表示子程序包含写数据的语句。默认是CONTAINS SQL。
    • SQLSECURITY{DEFINER|INVOKER}:用来指定子程序该使用创建子程序的许可来执行,还是使用调用者的许可来执行。默认是DEFINER。
    • COMMENT 'STIRNG':存储过程或函数的注释。

      删除存储过程和函数的具体语法

     查看存储过程或者函数

      存储过程或者函数创建后,用户可以通过以下方式查看存储过程或者函数的信息。查看存储过程或者函数状态的具体语法如下:

    SHOW {PROCEDURE|FUNCTION} STATUS [LIKE 'PATAERN']
    

      查看存储过程或者函数的定义的语句如下:

    SHOW CREATE {PROCEDURE|FUNCTION} SP_NAME
    

    变量的使用

      在存储过程和函数中可以使用变量,并且变量不区分大小写。通过declare可以定义一个局部变量,该局部变量的作用范围只能在begin...END中。变量的定义必须在符合语句的开头,并且在任何其他语句的前面。可以一次申请对个变量,也可以为变量设置DEFAULT默认值。定义变量的语法如下:

    DECLARE var_name[,...] type [DEAFULT value]
    

       变量可以直接赋值,或者通过查询赋值。具体语法如下:

    SET var_name=exp [,var_name=exp]...
    

       也可以通过查询语句给变量赋值,具体语法如下:

    SELECT col_name[,...] INTO var_name[,...] table_exp
    

    定义条件和处理

      条件的定义和处理可以用来定义在处理过程中遇到问题时相应的处理步骤。条件的定义如下:

      条件的处理

      通过实例来说明:

       实例2,当对主键异常进行处理时,执行结果如下:

      handler_type目前只支持CONTINUE和EXIT两种,CONTINUE表示继续执行下面的语句,EXIT则表示执行终止。condition_value的值可以是DECLARE定义的condition_name,可以是SQLSRATE的值或者mysql-error-code的值或者SQLWARNING、NOT FOUND、SQLEXCEPTION.

    • SQLWARNING是以所有01开头的SQLSTATE代码的速记。
    • NOT FOUND是对所有以02开头的SQLSTATE代码的速记。
    • SQLEXCEPTION是其他SQLSTATE代码的速记。

    光标的使用

      在存储过程和函数中可以使用光标对结果进行循环的处理。光标的使用包括声明、OPEN、FETCH和CLOSE。

      注意:变量、条件、处理程序和光标都是通过DECLAER定义,它们之间存在先后顺序。变量和条件必须定义在最前面,然后是光标的声明最后是处理程序。

    流程控制

      可以使用IF、CASE、LOOP、LEAVE、ITERATE、REPEAT及WHILE语句进行流程控制。

      IF语句进行条件判断。满足不同的条件执行不同语句列表,具体语法如下:

       CASE语句和IF语句功能类似,具体语法如下:

      例如

      LOOP语句实现简单的循环,退出循环的条件需要使用其他的语句定义,通常可以使用LEAVE实现,具体语法如下:

      LEAVE语句用来从标准的流控制中退出,通常可以和BEGIN...AND或者循环一起使用.

      ITERATE语句必须在循环使用,作用是跳出当前循环剩下的语句,直接进入下一轮循环。

      REPEAT语句是有条件的循环控制语句,当条件满足的时候退出循环,具体语法如下

      WHILE语句实现的也是有条件的循环控制语句,即当满足条件时执行循环的内容,具体的语法如下:

      WHILE循环和REPEAT循环的区别在于:WHILE是满足条件才执行循环,REPEAT是满足条件退出循环;WHILE最少执行0次,REPEAT最少执行一次。

      事件调度器可以将数据库按照自定义的时间周期触发某种操作,可以理解为时间触发器。例如

    CREATE EVENT myevent
    ON SCHEDULE AT CURRENT_TIMESTAMP+INTERVAL 1 HOUR
    DO
    UPDATE `mysql`.`user` SET mucol=mycol+1;
    
    • 事件名在CREATE EVENT后定义;
    • 通过ON SCHEDULE AT子句制定时间在何时执行及执行频次;
    • 通过DO子句制定要执行的操作或事件;

      事件调度器默认是关闭的,可以通过如下语句打开、关闭和删除事件调度器。

    SET GLOBAL event_scheduler=1;//打开
    ALTER EVENT myevent DISABLE;//关闭
    DROP EVENT myevent;//删除
    
  • 相关阅读:
    Pixysoft.Weblications.Notebooks 开发实录
    Pixysoft.Framework.Noebe.Recovery
    搞一个动态加载dll竟然搞了半天,郁闷。动态加载 卸载 Assembly, Appdomain。
    趁着09年还没有结束,写下我对10年的心愿
    再次出现系统更新失误
    自动备份恢复框架开发小结
    Pixysoft.Framework.Pageflows 页面流开发实录
    代码混淆软件 DotFuscator 非常严重的问题,放在首页通知一下各位。
    20100111 一次非常严重的开发事故
    自己orm框架的一个旷世大BUG!自己都恶心死了。
  • 原文地址:https://www.cnblogs.com/wxgblogs/p/5744476.html
Copyright © 2011-2022 走看看