一個存儲過程是一個可編程的函數,它在數據庫中創建並保存。
(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(); //判斷是否還有更多的結果集 跳出條件