Mysql 儲存過程迴圈查詢

2021-10-02 20:58:17 字數 3672 閱讀 9229

偶然需要在資料庫來實現部分功能學習了一下mysql的儲存過程,感覺還蠻有意思的。

需求是:

獲取傳入字串與資料庫中對應欄位的相似程度。

實現乙個取表中字串資料,迴圈比較傳入資料與表中資料相同位的個數,取出相似的對應值,作為查詢條件,返回查詢結果。

#當儲存過程存在的時候刪除

drop

procedure

ifexists imageserch;

#建立儲存過程,可以是有參的,可以是無參的

#語法:create procedure([[in |out |inout ] 引數名 資料類形...])

#in引數的值必須在呼叫儲存過程時指定,在儲存過程中修改該引數的值不能被返回,為預設值

#out:該值可在儲存過程內部被改變,並可返回

#inout:呼叫時指定,並且可被改變和返回

create

procedure imageserch (

in dnacompare varchar(30

)#指定乙個字串的入參

)#begin和end之間是儲存過程的實現

begin

#開始首先也是定義變數,用於儲存查詢結果,中間過程的變數等

#declare variable_name [,variable_name...] datatype [default value];

#資料型別:int, float, date, varchar(length)

declare

dnasource varchar(30

);declare

a varchar(30

);declare

b varchar(30

);declare

i int

;declare

deff int

default0;

#這個用於處理游標到達最後一行的情況

declare

done int

default0;

#宣告游標cursor_name(cursor_name是個多行結果集)

#這裡使用游標來遍歷表中資料

declare

cursor_pic cursor

forselect

dnafrom

pic_work;

#設定乙個終止標記(如果不要這句,會出現1329 - no data - zero rows fetched, selected, or processed錯誤資訊)

#declare continue handler for sqlstate '02000' set done = 1;

declare

continue

handler

fornot found

set done =1;

#開啟游標

open cursor_pic;

#開始迴圈,判斷是否游標已經到達了最後作為迴圈條件

#while ... do ... end while

#repeat... end repeat

#repeat

while done <>1do

#獲取游標當前指標的記錄,讀取一行資料並傳給變數 dnasource

#下面兩種寫法都可以獲取到游標當前的值

#fetch next from cursor_pic into dnasource;

fetch cursor_pic into dnasource;

#輸出查出來的資料,可以使用select進行變數的輸出,方便除錯

#select dnasource;

set deff =0;

set i =0;

#遍歷該輸入資料與游標獲取的資料庫資料相似程度,使用迴圈

while i < char_length(dnasource)

doset a = substring(dnasource, i, i +1)

;set b = substring(dnacompare, i, i +1)

;#使用if判斷

if a != b then

set deff = deff +1;

endif

;#增加迴圈變數

set i = i +1;

endwhile

;#if的巢狀

#if ... then ... else ... end if

if done <>

1then

if deff <=

5then

insert

into pic_work_temp (dna)

values

(dnasource)

;commit

;#select deff;

endif

;endif;

#until done

#end

#repeat

endwhile

;#關閉游標

close cursor_pic;

#select dna from pic_work_temp;

select

*from

pic_work

where

dna in

(select dna from pic_work_temp)

;truncate

table pic_work_temp;

end

#呼叫儲存過程

call imageserch(

"1210101"

);

執行結果

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個字元

預設第乙個字元下標為1,即引數position必須大於等於1

mysql儲存過程之迴圈

1.客戶端建立乙個儲存過程,過程名稱為insert corp loop 2.填寫內容 delimiter drop procedure if exists insert corp loop create definer procedure insert corp loop in loop time ...

mysql 儲存過程 迴圈修改

mysql 迴圈修改 儲存過程 delimiter create procedure my proc begin declare billid int declare moneyorder decimal 10,2 declare stop int default 0 declare my curs...

mysql迴圈(儲存過程)

delimiter drop procedure if exists test create procedure test begin declare i int declare j int set i 11235 set j 02011200 while i 15236 do insert int...