1. 程式人生 > >mysql 存儲過程,傳人字符串數組

mysql 存儲過程,傳人字符串數組

ava string函數 一個數 big com hibernate ase create sea

mysql存儲過程解決數組傳參及遊標CURSOR的問題解決方案

  項目中遇到批量數據的處理,使用hibernate的出來太慢,修改為存儲過程。

第一版修改為應用循環調存儲過程,發現效果不理想。可能是頻繁的打開session和關閉。

第二版想法為,把所有參數傳入到存儲過程,循環參數為一個數組,mysql存儲過程裏沒有split函數,

取數組中的值通過substring截出,通過截的id值作為條件查詢數據,查詢到的數據有可能是

多條記錄,所有想通過遊標(CURSOR)進行結果集的循環進行處理,但是,

遊標(cursor)的特性

1,只讀的,不能更新的。
2,不滾動的
3,不敏感的,不敏感意為服務器可以活不可以復制它的結果表

遊標(cursor)必須在聲明處理程序之前被聲明,並且變量和條件必須在聲明遊標或處理程序之前被聲明。

第三版想法為,建立倆個存儲過程,第一個為截竄並調起第二個實際處理的存儲過程。

已下截竄存儲過程來自網絡:

drop procedure if exists Pro_DeleteLog; -- 存在即刪除
create procedure Pro_DeleteLog( Qualification varchar(100)) -- 定義參數
begin
declare i int ;
declare Start1 int;
declare Length int ;
declare TotalLenght int ;
declare filed varchar(100) ;
declare sqlStr varchar(2000) ;
declare stmtNovelSearch varchar(2000) ;
set i=1;
set Start1=1;
set Length=0;
set TotalLenght=length(Qualification); -- 計算輸入參數長度
select TotalLenght;
while i <=TotalLenght do -- i=1 開始
-- select SUBSTRING(Qualification,i,1);
if(SUBSTRING(Qualification,i,1)=‘,‘) -- 註意 mysql 的substring函數截取字符串是從1開始的,而不是0 與java JavaScript不同。
-- 從第i位開始截取一個字符,看是否等於,
then
set filed=SUBSTRING(Qualification,Start1,Length);-- 從start1開始截取length長度的字符
select filed;
call pro_do(filed);
set Start1=i+1;
set Length=0;
else
set Length=Length+1; -- 如果不是, 則截取的長度加1
end if;
set i=i+1;
end while;
end
-- 調用存儲過程 字段名以,分隔 註意最後 , 結尾
call Pro_DeleteLog(‘payload,backresult,dataset,effectrow,clientuser,loginuser,clientprg,‘)

轉載:http://www.cnblogs.com/bigcelestial/archive/2013/09/05/3303329.html

mysql 存儲過程,傳人字符串數組