mysql存储过程

来源:互联网 发布:painter软件怎么样 编辑:程序博客网 时间:2024/06/05 11:01
 
1、存储过程简介
一个存储过程是一个可编程的函数,它在数据库中创建并保存。
(1)存储过程增强了SQL语言的功能和灵活性
(2)存储过程允许标准组件是编程。
(3)存储过程能实现较快的执行速度   预编译。 比批处理快
(4)存储过程能够减少网络流量
(5)存储过程可被作为
2、创建存储过程
(1) delimiter //   从新设置分隔符  表示;不代表语句结束。
(2)create procedure demo2()  //创建存储过程  
begin //存储过程开始
select * from ss;       //过程体,要执行的sql语句
select "hello world" as welcome;
insert into ss values(1,'aaa');
end //存储过程结束
//            //用执行的分隔符表示结束
delimiter ;   将分隔符恢复

(3)调用存储过程
call demo2();  //调用存储过程


(4)带有参数的存储过程
create procedure proc1(OUT s int)  OUT表示输出参数
select count(*) into s from user;   //查询多少记录并存入到s中


例: delimiter //
    create procedure demo3(out s int)
    begin
    select count(*) into s from ss;
    end // 
   set @var1=1//
  call demo3(@var1)//
  select @var1//
   delimiter ;   恢复分隔符
 (5)参数共分为三种  输出  输入 输入输出    默认为IN 
IN 输入参数:表示该参数的值必须是调用存储过程时指定,在存储过程中修改该参数的值不能被返回,为默认值
delimiter //
create procedure demo_in(IN p_in int)
begin
select p_in;
set p_in=50;
select p_in;
end // 
delimiter ;
调用   call demo_in(100);
变量调用  set @p_in=5;
 call demo_in(@p_in);
 select @p_in;  结果依然为5 
//接受调用该存储过程时传的值  
OUT输出参数:该值可在存储过程内部被改变,并可返回
delimiter //
create procedure demo_out(out out_var int)
begin
select out_var;
set out_var=50;
select out_var;
end // 
delimiter ;
调用  set @out_var=5;
     call demo_out(@out_var);
      select @out_var;
//结果出现null  因为它不能接受值,因为它为输出,
//不能接受调用该存储过程时传的值参数的值

INOUT输入输出:调用时指定,并且改变和返回
delimiter //
create procedure demo_inout(inout in_out_var int)
begin 
select in_out_var;
set in_out_var=50;
select in_out_var;
end // 
delimiter ;
调用:set @in_out_var=5;
     call demo_inout(@in_out_var);
select @in_out_var;
3、变量
(1)局部变量定义 (只在过程中有效)
//声明一定要放在存储过程的开始。
定义:declare l_int int unsigned default 4000;
赋值  set l_int=50;
delimiter //
create procedure demo_var()
begin
declare l_int int default 100;
declare l_varchar varchar(40);
set l_varchar=".net program";
select l_int;
select l_varchar;
select @x;
select @z;
end //
(2)用户变量
可以直接使用。 与js中var类型相似
set @x=10;
set @a='aaa';
//在此会话中全部有效。
set @z=12*8;
select @z;
set @x="java program";
select @x;

concat('aa','bbb');  //连接两个字符串  函数
在存储过程传递全局范围的用户变量
注意:
1)用户变量名一般以@开头
2)滥用用户变量会导致程序难以理解及管理
4、注释
/* 多行注释*/
-- 单行注释
5、查看存储过程
show procedure status where db=数据库名;
show create procedure 存储过程名   查看创建存储过程的语句
drop procedure  存储过程名  删除指定存储过程
alert procedure 存储过程名   更新
begin
end


6、条件语句
语法格式 if-then -else
if 测试条件 then  语句列表
[else if 条件1 then 语句1]
[else 语句]
end if  --注意,表示if语句结束标识
例: 
delimiter //
create procedure campar(in k1 int,in k2 int,out k3 varchar(10)) 
begin
if k1>k2 then
set k3="大于";
else if k1<k2 then
set k3="小于";
else   
set k3="等于";
end if;
end //
delimiter ;
7:case语句
一般格式
case var
when 0 then
insert into t values(11);
when 1 then
insert into t values(12);
else
insert into t values(13);
end case;

case 
when var=0 then
inser into t values(14);
when var>0 then

when var<0 then

else

end case;


8、循环机制  语法
(1)while循环
while 条件 do
insert into t varlues(var);
set var=var-1;
end while;
(2)、repeat.... end repeat;
repeat 
insert into t varlues(v);--循环体
set v=v+1;
util var>=5;  --循环条件
end repeat;

util 直到条件成立  跳出循环
(3)、loop....end loop;
loop循环不需要初始条件
LOOP_LABLE:loop
--循环体
if v>=5 then
leave LOOP_LABLE;   --跳到标号外,跳出循环
end if;
end loop;
9、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 
TRIM([[BOTH|LEADING|TRAILING] [padding] FROM]string2) //去除指定位置的指定字符
UCASE (string2 ) //转换成大写
RIGHT(string2,length) //取string2最后length个字符
SPACE(count) //生成count个空格




10、数学类
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为小数位数]
注:返回类型并非均为整数,
二、Java代码处理多个结果集
String sql="{call test_mutil()}";
st=con.prepareCall(sql);
boolean flag=st.execute(); //如果为真,表示最少有一个结果集
int i=0;
while(flag){
System.out.println("第"+(++i)+"结果集:");
rs=st.getResultSet();
while(rs.next){
//读取结果集数据
System.out.println(rs.getString(1));
}
flag=st.getMoreResults(); //判断是否还有更多的结果集  跳出条件
原创粉丝点击