mysql存儲過程

 
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(); //判斷是否還有更多的結果集  跳出條件
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章