一 存储过程的介绍
1.存储过程的概念
存储过程类似于java中的函数或方法,可以在数据库中编写函数或方法对数据库数据进行处理,现在在java中因为有了分层的出现,业务逻辑层就会对存储的数据进行处理。可是爱金融证券中,,存储过程用的还是比较多的,比如银行算利息,他们不敢让程序员去写处理数据的方法,一旦出错就是大错。
存储过程是一个可编辑的函数,它在数据库中创建并保存
2.存储过程的优点:
(1)存储过程增强了sql语句的功能和灵活性
(2)存储过程允许标准组件是编程
(3)存储过程能实现较快的执行速度
(4)存储过程能减少网络流量
(5)存储过程可被作为一种安全机制来充分利用
二 存储过程的创建
1.基本的创建模式
mysql> delimiter //
mysql> create procedure demo2()
-> begin
-> select "hello world" as welcome;
-> end
-> //
-> delimiter ;
注:delimeter // 语句的意思是:重新指定分隔符
在mySQL下是以 ; 为一句话的结束标志,而在存储过程中,必须要指定分隔符,并且再执行完存储过程之后,要恢复原有的分隔符,即为:
delimiter ;
2.存储过程的调用
call demo2()// 或 call demo2()//; 关键看是否恢复原有的分隔符
三 带参数的存储过程的创建
1.语法
create procedure 存储过程名(in|out|inout 参数名 数据类型)
in输入参数:表示该参数的值必须在调用存储过程时指定,在存储过程中修改该参数的值不能被返回,为默认值
out输出参数:该值可以在存储过程内部改变,并可返回
inout输入输出参数:调用时指定,并可以被改变和返回
2.In参数的实例分析
创建:
delimiter //
create procedure demo_in_parameter(in in_var int)
begin
select in_out_var;
set in_out_var=50;
select in_out_var;
end//
执行:
为参数设置值:set in_var=2;
调用存储过程:call demo_in_parameter(in_var);
得到的结果为:2
解析:输入可以接受调用该存储过程时传的值
3.Out参数的实例分析
创建:
delimiter //
create procedure demo_out_parameter(out out_var int)
begin
select out_var;
set out_var=60;
select out_var
end //
执行:
为参数设置值:set in_var=2;
调用存储过程:call demo_out_parameter(in_var);
得到的结果:60
解析:输出类型的参数不能接受调用该存储过程时传过来的值
4.Inout参数的实例分析
创建:
delimiter //
create procedure demo_inout_parameter(inout out_var int)
begin
select out_var;
set out_var=50;
select out_var
end //
执行:
为参数设置值:set in_var=2;
调用存储过程:call demo_out_parameter(in_var);
得到的结果:2
解析:输出输出类型的参数可以接受调用该存储过程时传的值,也可以接受调用该存储过程时传过来的值
5.变量的定义和使用
变量分为局部变量和用户变量(成员变量)
(1)局部的变量的声明一定要放在存储过程体的最开始,可以写为:
1. DECLARE l_int int unsigned default 4000000;
2. DECLARE l_numeric number(8,2) DEFAULT 9.95;
3. DECLARE l_date date DEFAULT '1999-12-31';
4. DECLARE l_datetime datetime DEFAULT '1999-12-31 23:59:59';
5. DECLARE l_varchar varchar(255) DEFAULT 'This will not be padded';
(2)用户变量:带@符号为用户变量
用户变量就是成员变量,在这个类中都可以使用,以@符号开头
例子:
1. mysql > SELECT 'Hello World' into @x;
2. mysql > SELECT @x;
3. +-------------+
4. | @x |
5. +-------------+
6. | Hello World |
7. +-------------+
8. mysql > SET @y='Goodbye Cruel World';
9. mysql > SELECT @y;
10. +---------------------+
11. | @y |
12. +---------------------+
13. | Goodbye Cruel World |
14. +---------------------+
15.
16. mysql > SET @z=1+2+3;
17. mysql > SELECT @z;
18. +------+
19. | @z |
20. +------+
21. | 6 |
22. +------+
ⅱ. 在存储过程中使用用户变量
1. mysql > CREATE PROCEDURE GreetWorld( ) SELECT CONCAT(@greeting,' World');
2. mysql > SET @greeting='Hello';
3. mysql > CALL GreetWorld( );
4. +----------------------------+
5. | CONCAT(@greeting,' World') |
6. +----------------------------+
7. | Hello World |
8. +----------------------------+
ⅲ. 在存储过程间传递全局范围的用户变量
1. mysql> CREATE PROCEDURE p1() SET @last_procedure='p1';
2. mysql> CREATE PROCEDURE p2() SELECT CONCAT('Last procedure was ',@last_procedure);
3. mysql> CALL p1( );
4. mysql> CALL p2( );
5. +-----------------------------------------------+
6. | CONCAT('Last procedure was ',@last_proc |
7. +-----------------------------------------------+
8. | Last procedure was p1 |
9. +-----------------------------------------------+
Iii
创建:
Delimiter //
Create procedure demo3(out s int)
Begin
Select count(*) into s from testclob;
End //
执行:
设置变量值:Set @var1=1
调用存储过程Call demo3(@var1)//
6.注释的添加
/**/多行注释
--单行注释
查看存储过程
Show procedure status where db=’jdbc’
查看存储的语句
Show create procedure demo2//
7.存储过程的控制语句
(1)变量的作用域
内部的变量在其作用域范围内享有更高的优先权,当执行到end时,局部变量就消失
创建:
Create procedure proc3()
Begin
Declare x1 varchar(5) default ‘outer’;
Begin
Declare x1 varchar(5) default ‘inter’;
Select x1;
End
Select x1;
End;
执行:
执行语句Call procedure proc3()//
结果:inter outer
(2)条件if-else
create procedure camper(in k1 int,in k2 int,out k3 varchar(10))
begin
if k1>k2 then
Set k3="大于";
elseif k1<k2 then
Set k3="小于";
else
Set k3="等于";
end if;
end;
(3)case语句
Case的第一种表示方法:
mysql> create procedure proc1(in param int)
-> begin
-> declare var int;
-> set var=param+1;
-> case var
-> when 0 then
-> insert into t values(17);
-> when 1 then
-> insert into t values(18);
-> else
-> insert into t values(19);
-> end case;
-> end;
执行结果:
mysql> call proc1(-1);
Query OK, 1 row affected
mysql> select * from t;
+----+
| s1 |
+----+
| 17 |
+----+
1 row in set
mysql> call proc1(0);
Query OK, 1 row affected
mysql> select * from t;
+----+
| s1 |
+----+
| 17 |
| 18 |
+----+
2 rows in set
mysql> call proc1(10);
Query OK, 1 row affected
mysql> select * from t;
+----+
| s1 |
+----+
| 17 |
| 18 |
| 19 |
+----+
3 rows in set
Case的第二种表示方法
Case
When var=0 then
Insert into t values(10);
When var>0 then
When var<0 then
else
end case
实例:
mysql> create procedure proc2(in str varchar(10),out sex varchar(10))
-> begin
-> case
-> when str="m" then set sex="男";
-> when str="f" then set sex="女";
-> else
-> set sex="输入错误";
-> end case;
-> end;
mysql> set @result="";
mysql> select @result;
+---------+
| @result |
+---------+
| 男 |
+---------+
1 row in set
mysql> call proc2("f
",@result);
Query OK, 0 rows affected
mysql> select @result;
+---------+
| @result |
+---------+
| 女 |
+---------+
1 row in set
mysql> call proc2("s
",@result);
Query OK, 0 rows affected
mysql> select @result;
+----------+
| @result |
+----------+
| 输入错误 |
+----------+
1 row in set
(4)While循环
While ... end while:
mysql> create procedure proc3()
-> begin
-> declare var int default 10;
-> while var>0 do
-> insert into t values(var);
-> set var=var-1;
-> end while;
-> end;
(5)Repeat…end repeat
它在执行操作后检查结果,而while则是执行前检查
语法:
Repeat
循环体
Until 循环条件
End repeat
创建:
mysql> create procedure proc4()
-> begin
-> declare var int default 1;
-> repeat
-> insert into t values(var);
-> set var=var+1;
-> until var>10
-> end repeat;
-> end;
(5)Loop...end loop:
mysql> create procedure proc5()
-> begin
-> declare var int default 1;
-> loop lable:loop
-> insert into t values(var);
-> set var=var+1;
-> if var>10 then
-> leave loop_lable;
-> end if;
-> end loop;
-> end;
(6)删除和修改存储过程
删除
Drop procedure 表名
修改就是重建
alter procedure 表名
8.存储过程的基本函数
(1).字符串类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
1. mysql> select substring('abcd',0,2);
2. +-----------------------+
3. | substring('abcd',0,2) |
4. +-----------------------+
5. | |
6. +-----------------------+
7. 1 row in set (0.00 sec)
8.
9. mysql> select substring('abcd',1,2);
10. +-----------------------+
11. | substring('abcd',1,2) |
12. +-----------------------+
13. | ab |
14. +-----------------------+
15. 1 row in set (0.02 sec)
TRIM([[BOTH|LEADING|TRAILING] [padding] FROM]string2) //去除指定位置的指定字符
UCASE (string2 ) //转换成大写
RIGHT(string2,length) //取string2最后length个字符
SPACE(count) //生成count个空格
(2).数学类
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)默认变为整形值
1. mysql> select round(1.23);
2. +-------------+
3. | round(1.23) |
4. +-------------+
5. | 1 |
6. +-------------+
7. 1 row in set (0.00 sec)
8.
9. mysql> select round(1.56);
10. +-------------+
11. | round(1.56) |
12. +-------------+
13. | 2 |
14. +-------------+
15. 1 row in set (0.00 sec)
(2)可以设定小数位数,返回浮点型数据
1. mysql> select round(1.567,2);
2. +----------------+
3. | round(1.567,2) |
4. +----------------+
5. | 1.57 |
6. +----------------+
7. 1 row in set (0.00 sec)
SIGN (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_value d_type ) //在date2中加上日期或时间
DATE_FORMAT (datetime ,FormatCodes ) //使用formatcodes格式显示datetime
DATE_SUB (date2 , INTERVAL d_value d_type ) //在date2上减去一个时间
DATEDIFF (date1 ,date2 ) //两个日期差
DAY (date ) //返回日期的天
DAYNAME (date ) //英文星期
DAYOFWEEK (date ) //星期(1-7) ,1为星期天
DAYOFYEAR (date ) //一年中的第几天
EXTRACT (interval_name FROM date ) //从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) //分返回符号,正负或0
SQRT(number2) //开平方