MySql的存储过程学习小结附pdf文档下载
2023-06-13 09:14:33 时间
存储过程是一种存储在数据库库中的程序(就像正规语言里的子程序一样),准确的来说,MySql支持的“routine(例程)”有两种:一是我们说的存储过程,二是在其它sql语句中可以返回值的函数(使用起来和mysql预装载的函数一样,如pi())。
一个存储过程包括名字,参数列表,以及可以包括很多sql语句的sql语句集。在这里对局部变量,异常处理,循环控制和if条件语句有新的语法定义。
下面是一个包括存储过程的实例声明:
复制代码代码如下:
一个存储过程包括名字,参数列表,以及可以包括很多sql语句的sql语句集。在这里对局部变量,异常处理,循环控制和if条件语句有新的语法定义。
下面是一个包括存储过程的实例声明:
CREATEPROCEDUREprocedurel/*name存储过程名*/
(INparameter1INTEGER)/*parameters参数*/
BEGIN/*startofblokc语句块头*/
DECLAREvariable1CHAR(10);/*variables变量声明*/
IFparameter1=17THEN/*startofIFIF条件开始*/
SETvariable1="birds";/*assignment赋值*/
ENDIF;/*endofIFIF结束*/
INSERTINTOtable1VALUES(variable1);/*statementSQL语句*/
END/*endofblock语句块结束*/
MySQL版本:5.0.45phpMyAdmin版本:2.11.3
首先看MySQL5.0参考手册中关于创建存储过程的语法说明:
CREATE
[DEFINER={user|CURRENT_USER}]
PROCEDUREsp_name([proc_parameter[,...]])
[characteristic...]routine_body
proc_parameter:
[IN|OUT|INOUT]param_nametype
type:
AnyvalidMySQLdatatype
characteristic:
LANGUAGESQL
|[NOT]DETERMINISTIC
|{CONTAINSSQL|NOSQL|READSSQLDATA|MODIFIESSQLDATA}
|SQLSECURITY{DEFINER|INVOKER}
|COMMENT"string"
routine_body:
ValidSQLprocedurestatement
如果你对MySQL还不太熟悉的话,单单看这个语法结构当然不足以进行MySQL存储过程编程。我之前基本都是使用MSSQLSERVER,所以以下记录我熟悉MySQL存储过程的过程,也是重点介绍MSSQLSERVER与MySQL区别较大的地方。
第一步,当然是写个HelloWord的存储过程,如下:
CREATEPROCEDUREphelloword()
BEGIN
SELECT"HelloWord!"ASF;
END;
将上面创建phelloword存储过程的语句拷到phpMyAdmin中执行,报如下错误:
#1064-YouhaveanerrorinyourSQLsyntax;checkthemanualthatcorrespondstoyourMySQLserverversionfortherightsyntaxtousenear""atline3
在这个问题上我纠缠了很久,在MySQL的命令行工具中执行同样不成功,但是根据提示信息可以知道执行在SELECT"HelloWord!"ASF;处结束,后面的END;没有执行,这显然会导致错误。
这里需要选择以个分隔符,语法如下:DELIMITER//
分隔符是通知MySQL客户端已经输入完成的符号。一直都是用“;”,但是在存储过程中不行,因为存储过程中很多语句都需要用到分号。
因此上面的存储过程改为:
CREATEPROCEDUREptest()
BEGIN
SELECT"HelloWord!"ASF;
END//
另外在phpMyAdmin中执行时,在Delimiter文本框中填写//,这次存储过程即可创建成功。
第二步,写一个包括参数,变量,变量赋值,条件判断,UPDATE语句,SELECT返回结果集的完整的一个存储过程,如下:
CREATEPROCEDUREplogin
(
p_usernamechar(15),
p_passwordchar(32),
p_ipchar(18),
p_logintimedatetime
)
LABEL_PROC:
BEGIN
DECLAREv_uidmediumint(8);
DECLAREv_realpasswordchar(32);
DECLAREv_nicknamevarchar(30);
DECLAREv_oltimesmallint(6);
SELECTu.uid,u.password,f.nickname,u.oltimeINTOv_uid,v_realpassword,v_nickname,v_oltime
FROMcdb_membersuINNERJOINcdb_memberfieldsfONf.uid=u.uidWHEREu.username=p_username;
IF(v_uidISNULL)THEN
SELECT2ASErrorCode;
LEAVELABEL_PROC;
ENDIF;
IF(p_password<>v_realpassword)THEN
SELECT3ASErrorCode;
LEAVELABEL_PROC;
ENDIF;
UPDATEipsp_userexpandsSETlastloginip=p_ip,lastlogintime=p_logintimeWHEREuid=v_uid;
SELECT0ASErrorCode,v_uidASuid,v_nicknameASnickname,v_oltimeASoltime;
ENDLABEL_PROC//
首先要说的是给变量赋值的语法,MySQL中使用SELECTu.uid,u.password,f.nickname,u.oltimeINTOv_uid,v_realpassword,v_nickname,v_oltimeFROMcdb_membersuINNERJOINcdb_memberfieldsfONf.uid=u.uidWHEREu.username=p_username;这种方式给变量赋值。
其次是条件判断的语法结构,如下所示:
IF...THEN
...;
ELSE
IF...THEN
...;
ELSEIF
...;
ELSE
...;
ENDIF;
ENDIF;
最后说说LEAVE语法的使用。当满足某种条件,不继续执行下面的SQL时,在MSSQLSERVER中使用RETURN语法,在MySQL中我没有找到对应的关键字,但是这里可以利用LEAVE语法来满足要求,在存储过程的BEGIN前定义一个标签,如:“LABEL_PROC:”然后再需要用到RETURN中断执行的地方执行“LEAVELABEL_PROC;”即可。
第三步,创建一个执行动态SQL的存储过程。
CREATEPROCEDUREipsp_getresourcedir
(
p_hashcodechar(40)
)
LABEL_PROC:
BEGIN
DECLAREv_sqlvarchar(200);
SETv_sql=CONCAT("SELECTfiledirFROMipsp_resourcesWHEREhashcode=\"",p_hashcode,"\"LIMIT0,1");
SET@sql=v_sql;
PREPAREslFROM@sql;
EXECUTEsl;
DEALLOCATEPREPAREsl;
ENDLABEL_PROC//
这里提一下“\”是转义字符,拼接成的SQL类似SELECTfiledirFROMipsp_resourcesWHEREhashcode="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"LIMIT0,1
另外@sql这个属于用户变量,具体用法请查询MySQL参考手册。
如果有在MSSQLSERVER上编写存储过程的经验的话,看完这些,我想基本的MySQL存储过程编程应该可以应付了吧!
想了解更多的内容可查询MySQL参考手册或者相关书籍!
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)
|位或
&位与
<<左移位
>>右移位
~位非(单目运算,按位取反)
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_nameFROMdate)//从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,
相关文章
- 如何像编辑ppt一样编辑pdf文档?Acrobat DC--最牛逼的PDF编辑器
- 解决MySQL数据库乱码问题:改用GBK编码(mysql乱码gbk)
- MySQL入门指南:必备PDF版本(mysql必知必会pdf)
- MySQL轻松上手,服务器安全搞定(服务器安装了mysql)
- MySQL入门经典:学习PDF指南(mysql入门经典pdf)
- MySQL安全:设置强大的登录密码(mysql设置登录密码)
- MySQL入门指南:PDF版(mysql入门pdf)
- Oracle数据库的PDF文档简介(oracle数据库pdf)
- MySQL手册PDF版下载及使用指南(mysql手册pdf)
- MySQL命令:重启数据库服务(mysql命令重启)
- 如何使用MySQL优化技巧提高PDF文档处理效率(mysql优化pdf)
- MySQL参数详解,让你更加了解Mysql参数定义及优化。(mysql参数定义)
- MySQL中实现枚举类型的简单方式(mysql中枚举类型)
- MySQL高性能:从PDF走向实现(mysql高性能pdf)
- C语言数据库MySQL文档简介(c mysql 文档)
- C语言与MySQL联手打造实体框架(C mysql 实体框架)
- CAD与MySQL的联合应用提升信息管理效率(cad和mysql)
- MySQL与Oracle的比较优势与劣势(mysql比oracle)
- MySQL创建表示例快速掌握MYSQL基础操作(mysql中创建表的例子)
- Oracle存储PDF文档的最佳方法(oracle保存pdf)
- GET MYSQL 免费下载并破解MySQL数据库软件(mysql下载和破解)
- MySQL下载PDF指南(mysql下载pdf)
- Mysql 数据库丢失别慌来了解一下 MySQL 不见的可能原因及解决办法(mysql不见)
- MYSQL离线使用方法大揭秘不联网也能愉快地使用MySQL(mysql 不联网吗)
- 用MySQL计算一列数据的总和掌握简单的语法快速实现(mysql 一列 总和)