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
- 如果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; 语句 --仅仅用在存储函数中的语句!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)