最近由于测试的需求,需要往数据库中插入大量的模拟数据,组织要求使用存储过程,所以这两天一直在看这个,下面把这两天的学习心得给大家分享下
1. 创建自己的第一个procedure (空的,不能完成任何操作)
CREATEPROCEDURE `NewProcedure`(`Param` int(11))
BEGIN
END;
2. 区块定义
1) 常用:
BEGIN END;
2) 也可以给区块起别名,如:
myLable:BEGIN END myLable;
注意:可以使用leave myLable跳出区块,执行区块以后的代码
3) 条件语句:
If 条件 then Statement1 Else Statement2 End if;
解析:如果条件成立,那么statement1;否则执行statement2,显示声明条件语句结束。
4) 循环语句
A. While语句
[label:] while expression do Statements End while[label];
解析:当 expression条件成立时,do statements;显示声明while语句结束。
B. Loop循环
[label:]Loop Statements End Loop[label];
解析:循环 statements ,到结束循环。(没看懂在什么情况下可以结束)
C. Repeat until循环
[label:]REPEAT Statements UNTIL expression END REPEAT [label];
解析:重复statements ,直到expression成立,结束循环repeat.
5) 其他命令
1) 调用存储过程
call sp_name()
注意:存储过程名称后面必须加括号,哪怕该存储过程没有参数传递
2) 删除存储过程
drop procedure sp_name
注意:不能在一个存储过程中删除另一个存储过程,只能调用另一个存储过程
3) 查看存储过程的信息
show procedure status
显示数据库中所有存储的存储过程基本信息,包括所属数据库,存储过程名称,创建时间等
show create procedure sp_name
显示某一个存储过程的详细信息
3. 操作符
1) 算数操作符
+ - * / div %
解析:div表示整除;/不表示整除,如果有余数也会显示出来
2) 比较运算符
>,
<,
<=,
>=,
BETWEEN : EX: 5 BETWEEN 1 AND 10 àtrue
NOT BETWEEN ,EX: 5 not between 1 and10 àfalse
IN 在集合中 5 in(1,2,3,4) àfalse
NOT IN
= //表示等于(不表示赋值;如果要表示赋值,要加上set 关键字)
<>,!= //表示不等于
<=> 严格比较两个null值是否相等 null<==>null àtrue
LIKE 简单模式匹配 “guy Harrison”like “guy%” àtrue
REGEXP 正则式匹配 “guy Harrison”regexp “[gg]reg”àfalse
IS NULL 为空 ex: 0 isnull àfalse
IS NOT NULL 不为空 ex: 0 isnot null àtrue
3) 逻辑运算符
AND , OR ,XOR(异或),
4) 位运算符
|,&,<<,>>,~(按位取反)
4. Mysql存储过程基本函数(有些没有写注释,如果不理解的话,可以baidu下)
1) 字符串类
Charset(str)
Concat(string2[,…])//连接字符串
Instr(string,substring)//返回substring首次在string中出现的位置,不存在返回零
Lcase(string2)//转小写
Left(string2,lengh)//从string2中的左边起取length个字符
Length(stirng)
Load_file(file_name)//从文件读取内容
Locate(substring,string[,start_position])//同instr,但可指定开始位置
Ltrim(stirng2)//去除前端空格
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个字符
Ucase(string2)//转换成大写
Right(string2,length)//取string2最后length个字符。
Space(count)//生成count个空格
Trim([[both|leading|trailing][padding]from]string2)//去除指定位置的指定字符。
注意:mysql中字符串的脚标是从1开始的。
2) 数字类
ABS(number2)//绝对值
Bin(deaimal_number)//十进制转二进制
Ceiling(number2)//向上取整
Conv(number2,from_base,to_base)//进制转换
Floor(number2)//向下取整
Format(number2,decimal_places)//保留小数位数
Hex(decimalNumber)//转16进制
注意:hex()可传入字符串,则返回asc-11码,
Last(number,number2[,…])//求最小值
Mod(numerator,denominator)//求余
Power(number,power)//求指数
Rand([seed])//随机数
Round(number[,decimals])//四舍五入,decimals为小数位数;如果不写decimal,则表示保留0位小数位。
Sign(number2)//返回符号,正负或0
Sqrt(number2)//开平方
3) 日期类
Addtime(date2,time_interval)//将time_interval加到date2
Convert_tz(datetime2,fromTZ,toTZ)//转换时区
Current_date()//当前日期
Current_time()//当前时间
Current_timestamp()//当前时间戳
Date(datetime)//返回datetime的日期部分
Date_add(date2,interval d_valued_type)//在date2中加上日期或时间
Date_format(datetime,formatCodes)//使用formatcodes格式显示datetime
Date_sub(date2,interval d_valued_type)//date2上减去一个时间
Datediff(date1,date2)//两个日期差
Day(date)//返回日期的天
Dayname(date)//英文日期
Dayofweek(date)//星期(1-7),7为星期天
Dayofyear(date)//一年中的第几天
Extract(interval_name from date)//从date中起初日期的指定部分。
Makedate(year,day)//给出年及年中的第几天,生成日期串
Maketime(hour,minute,seond)//生成时间串
Monthname(date)//英文月份名
Now()//当前时间
Sec_to_time(seconds)//秒数转成时间,以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)//月
Minute(datetime)//分
附:可用在INTERVAL中的类型
DAY ,DAY_HOUR ,DAY_MINUTE ,DAY_SECOND ,HOUR ,HOUR_MINUTE ,HOUR_SECOND ,MINUTE,MINUTE_SECOND,MONTH ,SECOND ,YEAR
5. 在java中调用存储过程的方法(没有试验过,先摘录下来)
Connection connection = DriverManager.getConnection(url,username,password);
· String procedure = “{ = call myProc(,)}”;
· CallableStatement statement = connection.prepareCall(procedure);
· statement.setString(2,×××);
· statement.setFloat(3,×××);
· statement.registerOutParameter(1,Types.INTEGER);
· statement.execute();
· int row = statement.getInt(1);