MySQL 创建存储过程.docx
- 文档编号:9437430
- 上传时间:2023-02-04
- 格式:DOCX
- 页数:21
- 大小:19.98KB
MySQL 创建存储过程.docx
《MySQL 创建存储过程.docx》由会员分享,可在线阅读,更多相关《MySQL 创建存储过程.docx(21页珍藏版)》请在冰豆网上搜索。
MySQL创建存储过程
MySQL创建存储过程
“pr_add”是个简单的MySQL存储过程,这个存储过程有两个int类型的输入参数
“a”、“b”,返回这两个参数的和。
dropprocedureifexistspr_add;
--计算两个数之和
createprocedurepr_add
(
aint,
bint
)
begin
declarecint;
ifaisnullthen
seta=0;
endif;
ifbisnullthen
setb=0;
endif;
setc=a+b;
selectcassum;
/*
returnc;-不能在MySQL存储过程中使用。
return只能出现在函数中。
/
end;
二、调用MySQL存储过程
callpr_add(10,20);
执行MySQL存储过程,存储过程参数为MySQL用户变量。
set@a=10;
set@b=20;
callpr_add(@a,@b);
三、MySQL存储过程特点
创建MySQL存储过程的简单语法为:
createprocedure存储过程名字()
(
[in|out|inout]参数datatype
)
begin
MySQL语句;
end;
MySQL存储过程参数如果不显式指定“in”、“out”、“inout”,则默认为“in”。
习惯上,对于是“in”的参数,我们都不会显式指定。
1.MySQL存储过程名字后面的“()”是必须的,即使没有一个参数,也需要“()”
2.MySQL存储过程参数,不能在参数名称前加“@”,如:
“@aint”。
下面的创建存
储过程语法在MySQL中是错误的(在SQLServer中是正确的)。
MySQL存储过程中
的变量,不需要在变量名字前加“@”,虽然MySQL客户端用户变量要加个“@”。
createprocedurepr_add
(
@aint,-错误
bint -正确
)
3.MySQL存储过程的参数不能指定默认值。
4.MySQL存储过程不需要在procedurebody前面加“as”。
而SQLServer存储过
程必须加“as”关键字。
createprocedurepr_add
(
aint,
bint
)
as -错误,MySQL不需要“as”
begin
mysqlstatement...;
end;
5.如果MySQL存储过程中包含多条MySQL语句,则需要beginend关键字。
createprocedurepr_add
(
aint,
bint
)
begin
mysqlstatement1...;
mysqlstatement2...;
end;
6.MySQL存储过程中的每条语句的末尾,都要加上分号“;”
...
declarecint;
ifaisnullthen
seta=0;
endif;
...
end;
7.MySQL存储过程中的注释。
/*
这是个
多行MySQL注释。
/
declarecint; -这是单行MySQL注释(注意-后至少要有一个空格)
ifaisnullthen这也是个单行MySQL注释
seta=0;
endif;
...
end;
8.不能在MySQL存储过程中使用“return”关键字。
setc=a+b;
selectcassum;
/*
returnc;-不能在MySQL存储过程中使用。
return只能出现在函数中。
/
end;
9.调用MySQL存储过程时候,需要在过程名字后面加“()”,即使没有一个参数,也
需要“()”
callpr_no_param();
10.因为MySQL存储过程参数没有默认值,所以在调用MySQL存储过程时候,不能省
略参数。
可以用null来替代。
callpr_add(10,null);
mysql5.0存储过程学习总结
一.创建存储过程
1.基本语法:
createproceduresp_name()
begin
………
end
2.参数传递
二.调用存储过程
1.基本语法:
callsp_name()
注意:
存储过程名称后面必须加括号,哪怕该存储过程没有参数传递
三.删除存储过程
1.基本语法:
dropproceduresp_name//
2.注意事项
(1)不能在一个存储过程中删除另一个存储过程,只能调用另一个存储过程
四.区块,条件,循环
1.区块定义,常用
begin
……
end;
也可以给区块起别名,如:
lable:
begin
………..
endlable;
可以用leavelable;跳出区块,执行区块以后的代码
2.条件语句
if条件then
statement
else
statement
endif;
3.循环语句
(1).while循环
[label:
]WHILEexpressionDO
statements
ENDWHILE[label];
(2).loop循环
[label:
]LOOP
statements
ENDLOOP[label];
(3).repeatuntil循环
[label:
]REPEAT
statements
UNTILexpression
ENDREPEAT[label];
五.其他常用命令
1.showprocedurestatus
显示数据库中所有存储的存储过程基本信息,包括所属数据库,存储过程名称,创建时
间等
2.showcreateproceduresp_name
显示某一个存储过程的详细信息
mysql存储过程中要用到的运算符
mysql存储过程学习总结-操作符
算术运算符
+ 加 SETvar1=2+2; 4
- 减 SETvar2=3-2; 1
* 乘 SETvar3=3*2; 6
/ 除 SETvar4=10/3; 3.3333
DIV 整除SETvar5=10DIV3; 3
% 取模SETvar6=10%3; 1
比较运算符
> 大于1>2False
< 小于2<1False
<= 小于等于2<=2True
>= 大于等于3>=2True
BETWEEN 在两值之间5BETWEEN1AND10True
NOTBETWEEN 不在两值之间5NOTBETWEEN1AND10False
IN 在集合中5IN(1,2,3,4)False
NOTIN 不在集合中5NOTIN(1,2,3,4)True
= 等于2=3False
<>,!
= 不等于2<>3False
<=> 严格比较两个NULL值是否相等NULL<=>NULLTrue
LIKE 简单模式匹配"GuyHarrison"LIKE"Guy%"True
REGEXP 正则式匹配"GuyHarrison"REGEXP"[Gg]reg"False
ISNULL 为空0ISNULLFalse
ISNOTNULL 不为空0ISNOTNULLTrue
逻辑运算符
与(AND)
AND
TRUE
FALSE
NULL
TRUE
TRUE
FALSE
NULL
FALSE
FALSE
FALSE
NULL
NULL
NULL
NULL
NULL
或(OR)
OR
TRUE
FALSE
NULL
TRUE
TRUE
TRUE
TRUE
FALSE
TRUE
FALSE
NULL
NULL
TRUE
NULL
NULL
异或(XOR)
XOR
TRUE
FALSE
NULL
TRUE
FALSE
TRUE
NULL
FALSE
TRUE
FALSE
NULL
NULL
NULL
NULL
NULL
位运算符
| 位或
& 位与
<< 左移位
>> 右移位
~ 位非(单目运算,按位取反)
mysq存储过程中常用的函数,字符串类型操作,数学类,日期时间类。
mysql存储过程基本函数
一.字符串类
CHARSET(str)//返回字串字符集
CONCAT(string2 [,...])//连接字串
INSTR(string,substring)//返回substring首次在string中出现的位置,不存在返
回0
LCASE(string2)//转换成小写
LEFT(string2,length)//从string2中的左边起取length个字符
LENGTH(string)//string长度
LOAD_FILE(file_name)//从文件读取内容
LOCATE(substring,string [,start_position])同INSTR,但可指定开始位置
LPAD(string2,length,pad)//重复用pad加在string开头,直到字串长度为length
LTRIM(string2)//去除前端空格
REPEAT(string2,count)//重复count次
REPLACE(str,search_str,replace_str)//在str中用replace_str替换search_str
RPAD(string2,length,pad)//在str后用pad补充,直到长度为length
RTRIM(string2)//去除后端空格
STRCMP(string1,string2)//逐字符比较两字串大小,
SUBSTRING(str,position [,length])//从str的position开始,取length个字符,
注:
mysql中处理字符串时,默认第一个字符下标为1,即参数position必须大于等于1
mysql>selectsubstring(’abcd’,0,2);
+———————–+
|substring(’abcd’,0,2)|
+———————–+
| |
+———————–+
1rowinset(0.00sec)
mysql>selectsubstring(’abcd’,1,2);
+———————–+
|substring(’abcd’,1,2)|
+———————–+
|ab |
+———————–+
1rowinset(0.02sec)
TRIM([[BOTH|LEADING|TRAILING][padding]FROM]string2)//去除指定位置的指定字
符
UCASE(string2)//转换成大写
RIGHT(string2,length)//取string2最后length个字符
SPACE(count)//生成count个空格
二.数学类
ABS(number2)//绝对值
BIN(decimal_number)//十进制转二进制
CEILING(number2)//向上取整
CONV(number2,from_base,to_base)//进制转换
FLOOR(number2)//向下取整
FORMAT(number,decimal_places)//保留小数位数
HEX(DecimalNumber)//转十六进制
注:
HEX()中可传入字符串,则返回其ASC-11码,如HEX(’DEF’)返回4142143
也可以传入十进制整数,返回其十六进制编码,如HEX(25)返回19
LEAST(number,number2 [,..])//求最小值
MOD(numerator,denominator)//求余
POWER(number,power)//求指数
RAND([seed])//随机数
ROUND(number [,decimals])//四舍五入,decimals为小数位数]
注:
返回类型并非均为整数,如:
(1)默认变为整形值
mysql>selectround(1.23);
+————-+
|round(1.23)|
+————-+
| 1|
+————-+
1rowinset(0.00sec)
mysql>selectround(1.56);
+————-+
|round(1.56)|
+————-+
| 2|
+————-+
1rowinset(0.00sec)
(2)可以设定小数位数,返回浮点型数据
mysql>selectround(1.567,2);
+—————-+
|round(1.567,2)|
+—————-+
| 1.57|
+—————-+
1rowinset(0.00sec)
SIGN(number2)//返回符号,正负或0
SQRT(number2)//开平方
三.日期时间类
ADDTIME(date2,time_interval)//将time_interval加到date2
CONVERT_TZ(datetime2,fromTZ,toTZ)//转换时区
CURRENT_DATE( )//当前日期
CURRENT_TIME( )//当前时间
CURRENT_TIMESTAMP( )//当前时间戳
DATE(datetime)//返回datetime的日期部分
DATE_ADD(date2,INTERVALd_valued_type)//在date2中加上日期或时间
DATE_FORMAT(datetime,FormatCodes)//使用formatcodes格式显示datetime
DATE_SUB(date2,INTERVALd_valued_type)//在date2上减去一个时间
DATEDIFF(date1,date2)//两个日期差
DAY(date)//返回日期的天
DAYNAME(date)//英文星期
DAYOFWEEK(date)//星期(1-7),1为星期天
DAYOFYEAR(date)//一年中的第几天
EXTRACT(interval_name FROMdate)//从date中提取日期的指定部分
MAKEDATE(year,day)//给出年及年中的第几天,生成日期串
MAKETIME(hour,minute,second)//生成时间串
MONTHNAME(date)//英文月份名
NOW( )//当前时间
SEC_TO_TIME(seconds)//秒数转成时间
STR_TO_DATE(string,format)//字串转成时间,以format格式显示
TIMEDIFF(datetime1,datetime2)//两个时间差
TIME_TO_SEC(time)//时间转秒数]
WEEK(date_time[,start_of_week])//第几周
YEAR(datetime)//年份
DAYOFMONTH(datetime)//月的第几天
HOUR(datetime)//小时
LAST_DAY(date)//date的月的最后日期
MICROSECOND(datetime)//微秒
MONTH(datetime)//月
MINUTE(datetime)//分
附:
可用在INTERVAL中的类型
DAY,DAY_HOUR,DAY_MINUTE,DAY_SECOND,HOUR,HOUR_MINUTE,HOUR_SECOND
MySQL存储过程例子,包含事务,参数,嵌套调用,游标,循环等
viewplaincopytoclipboardprint?
dropprocedureifexistspro_rep_shadow_rs;
delimiter|
----------------------------------
--rep_shadow_rs
--用来处理信息的增加,更新和删除
--每次只更新上次以来没有做过的数据
--根据不同的标志位
--需要一个输出的参数,
--如果返回为0,则调用失败,事务回滚
--如果返回为1,调用成功,事务提交
--
--测试方法
--callpro_rep_shadow_rs(@rtn);
--select@rtn;
----------------------------------
createprocedurepro_rep_shadow_rs(outrtnint)
begin
--声明变量,所有的声明必须在非声明的语句前面
declareiLast_rep_sync_idintdefault-1;
declareiMax_rep_sync_idintdefault-1;
--如果出现异常,或自动处理并rollback,但不再通知调用方了
--如果希望应用获得异常,需要将下面这一句,以及启动事务和提交事务的语句
全部去掉
declareexithandlerforsqlexceptionrollback;
--查找上一次的
selecteidintoiLast_rep_sync_idfromrep_de_proc_logwhere
tbl='rep_shadow_rs';
--如果不存在,则增加一行
ifiLast_rep_sync_id=-1then
insertintorep_de_proc_log(rid,eid,tbl)values(0,0,'rep_shadow_rs');
setiLast_rep_sync_id=0;
endif;
--下一个数字
setiLast_rep_sync_id=iLast_rep_sync_id+1;
--设置默认的返回值为0:
失败
setrtn=0;
--启动事务
starttransaction;
--查找最大编号
selectmax(rep_sync_id)intoiMax_rep_sync_idfromrep_shadow_rs;
--有新数据
ifiMax_rep_sync_id>=iLast_rep_sync_idthen
--调用
callpro_rep_shadow_rs_do(iLast_rep_sync_id,iMax_rep_sync_id);
--更新日志
updaterep_de_proc_logset
rid=iLast_rep_sync_id,eid=iMax_rep_sync_idwheretbl='rep_shadow_rs';
endif;
--运行没有异常,提交事务
commit;
--设置返回值为1
setrtn=1;
end;
|
delimiter;
dropprocedureifexistspro_rep_shadow_rs_do;
delimiter|
---------------------------------
--处理指定编号范围内的数据
--需要输入2个参数
--last_rep_sync_id是编号的最小值
--max_rep_sync_id是编号的最大值
--无返回值
---------------------------------
createprocedurepro_rep_shadow_rs_do(last_rep_sync_idint,max_rep_sync_id
int)
begin
declareiRep_operationtypevarchar
(1);
declareiRep_statusvarchar
(1);
declareiRep_Sync_idint;
declareiIdint;
--这个用于处理游标到达最后一行的情况
declarestopintdefault0;
--声明游标
declarecurcursorforselect
id,Rep
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- MySQL 创建存储过程 创建 存储 过程