Mysql:语法:存储程序(存储过程、存储函数、视图、触发器、计划任务)

存储程序分类

  • 存储过程
  • 存储函数
  • 视图
  • 触发器
  • 计划任务


在mysql.exe客户端里写存储程序的";"分割符问题

  这个问题来自mysql.exe客户端本身以";"作为语句的分隔符(结束符)本身。而大部分的管理、开发mysql的应用程序均类似于mysql.exe,所以必须通过delimiter这个mysql服务器可识别的命令来临时修改服务器认可的有效语句分隔符



存储程序组成结构
   [label name]
   begin
     [declare 普通变量|declare异常别名];
     [declare 异常别名|declare普通变量];
     [declare 游标;]
     [declare 异常处理;]
    
     [begin end 复合语句;]

 
     [循环语句;]
     [条件语句;]
     ......
  
   end [{lable name}]
  //


declare本地变量
  declare va11 [,var2] [,...] date_type [default value    --可以是表达式、常量]

  • 本地变量声明时要注意先后顺序:普通变量、游标、操作符
  • 本地变量可以一次声明同类型的多个变量 --类似于c语言,不同于postgresql、oracle;不可以指定[not] null 约束;不可以声明为constant 变量
  • 本地变量可以有初始化的default值,否则为null
  • 本地变量可以向内层begin end 符合语句传递,除非她被内层同名变量overide
  • 本地变量名字不要和表列同名,在过程内,本地变量总是优先被采用


set变量赋值
  set var1 = value1 [,var2 = value2] [,....]
  mysql的set语句可以对本地变量、系统变量、用户自定义变量赋值,而不仅仅是本地变量!

select变量赋值 必须返回0行或 1 行 记录
  select col1 [,col2] [,exp1] [,exp2] [,....] into val1 [,val2] [,val3] [,val4] [,....] from table_express

  1. 如果select没有返回数据,mysql有no data 的警告:warning with error code 1329 产生,变量保持原值
  2. 如果select返回多行数据,mysql或发生错误!可以通过limit 1 来限制。



mysql的异常处理
  declare conditon_name condition for {sqlstate [value] 'sqlvalue'|mysql_error_code}    --定义异常:目的是找一个含义更明显或更适合的名称;可理解为别名。
  declare {continue|exit|undo} handler for {sqlstate [value] 'sqlvalue'|mysql_error_code|conditon_name

      |sqlwarning|notfound|sqlexception} [,....]    --定义异常处理mysql的异常处理

  1. 类似于其他过程化sql语言的错误处理,只是结构和使用方法不同(postgresql、oracle都是固定的块结构的一可选部分exception;
  2. sqlserver是@@error 或try catch final)
  3. 这个handler可以和多个条件关联,类似于postgresql、oracle的when ... when ... when others...
  4. handler的sqlwarning 是 "01xxx"类的错误
  5. handler的not found 是 "02xxxx"类的错误
  6. handler的sqlexception 是 除了'00000'、'01xxxx'、"02xxxx"类的错误
  7. 注意sqlstate value ='00000' 或 mysql_error_code=0 表示操作成功,通常不应该去使用的!
  8. handler的continue表示当相关联的块的错误条件发生时、继续从出错的语句下一个语句执行;exit表示发生错误,立即终止程序的执行;undo目前尚未实现!
  9. 没有handler的块 或 定义了exit处理(不管是内层还是外层) 的程序 在错误发生时会终止程序的执行!
  10. 可以定义忽略任何错误的处理的空语句:declare continue handler for sqlwarning begin end;

 

游标:只读、仅单步向前、不敏感的

    declare cursor_name cursor for no_into_select_clause;
    open cursor_name;
    fetch cursor_name into var1 [,var2] [,...] ; 可能会产生 not found 异常错误
    close cursor_name 如果没有显式调用关闭游标的语句,游标会在作用域超出定义该游标的scope是自动销毁

  •     mysql的cursor读取没有特殊的内部变量。利用handler 和 "not found"条件来处理



控制结构
    if if_condition then
        statement_list;
    [elseif if_condition then statement_list;]
    [elsestatement_list;]
    end if;


    case
        when case_condition then statement_list;
        [when case_condition then statement_list;]
        [else statement_list;]
    end case;

   
[repeat_label:] repeat    --其他语言的do循环结构
        statement_list;
    util repeat_condition
    end repeat
[repeat_label];

   
[while_label:] while while_condition do    --其他语言的while循环结构
        statement_list;
    end while
[while_label];
   

    [loop_label:] loop        --一般循环结构,注意没有控制条件,必须在statement_list中含有控制条件、leave、iterate语句;
    then statement_list;
    end loop [loop_label];
   
   
    leave label_name;   

   
 
类似其他语言的exit [when..],跳出结构。用来退出begin..end、loop、repeat、while,前提是必须处于相应的结构里,且结构定义了标签
   
   
    iterate label_name;   
  
 
类似于其他语言的continue,继续下次循环。用来退出loop、repeat、while,前提是必须处于相应的结构里,且结构定义了标签
   

    函数的return exp; 语句    --仅仅用在存储函数中的语句!
   
   

posted on 2009-06-08 14:02  jinzhenshui  阅读(1108)  评论(0编辑  收藏  举报