您的位置:首页 > 数据库 > MySQL

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

2009-06-08 14:02 676 查看
存储程序分类

存储过程

存储函数

视图

触发器

计划任务

在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

如果select没有返回数据,mysql有no data 的警告:warning with error code 1329 产生,变量保持原值

如果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的异常处理

类似于其他过程化sql语言的错误处理,只是结构和使用方法不同(postgresql、oracle都是固定的块结构的一可选部分exception;

sqlserver是@@error 或try catch final)

这个handler可以和多个条件关联,类似于postgresql、oracle的when ... when ... when others...

handler的sqlwarning 是 "01xxx"类的错误

handler的not found 是 "02xxxx"类的错误

handler的sqlexception 是 除了'00000'、'01xxxx'、"02xxxx"类的错误

注意sqlstate value ='00000' 或 mysql_error_code=0 表示操作成功,通常不应该去使用的!

handler的continue表示当相关联的块的错误条件发生时、继续从出错的语句下一个语句执行;exit表示发生错误,立即终止程序的执行;undo目前尚未实现!

没有handler的块 或 定义了exit处理(不管是内层还是外层) 的程序 在错误发生时会终止程序的执行!

可以定义忽略任何错误的处理的空语句: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; 语句 --仅仅用在存储函数中的语句!

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: