mysql存儲過程詳解_第1頁
mysql存儲過程詳解_第2頁
mysql存儲過程詳解_第3頁
mysql存儲過程詳解_第4頁
mysql存儲過程詳解_第5頁
已閱讀5頁,還剩15頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、mysql存儲過程詳解1. 存儲過程簡介我們常用的操作數(shù)據(jù)庫語言sql 語句在執(zhí)行的時(shí)候需要要先編譯,然后執(zhí)行,而存儲過程( stored procedure )是一組為了完成特定功能的sql 語句集,經(jīng)編譯后存儲在數(shù)據(jù)庫中, 用戶通過指定存儲過程的名字并給定參數(shù)(如果該存儲過程帶有參數(shù))來調(diào)用執(zhí)行它。一個(gè)存儲過程是一個(gè)可編程的函數(shù),它在數(shù)據(jù)庫中創(chuàng)建并保存。它可以有sql 語句和一些特殊的控制結(jié)構(gòu)組成。當(dāng)希望在不同的應(yīng)用程序或平臺上執(zhí)行相同的函數(shù),或者封裝特定功能時(shí), 存儲過程是非常有用的。數(shù)據(jù)庫中的存儲過程可以看做是對編程中面向?qū)ο蠓椒ǖ哪M。它允許控制數(shù)據(jù)的訪問方式。存儲過程通常有以下優(yōu)點(diǎn)

2、:(1).存儲過程增強(qiáng)了 sql 語言的功能和靈活性。存儲過程可以用流控制語句編寫,有很強(qiáng)的靈活性,可以完成復(fù)雜的判斷和較復(fù)雜的運(yùn)算。(2).存儲過程允許標(biāo)準(zhǔn)組件是編程。存儲過程被創(chuàng)建后, 可以在程序中被多次調(diào)用,而不必重新編寫該存儲過程的sql 語句。而且數(shù)據(jù)庫專業(yè)人員可以隨時(shí)對存儲過程進(jìn)行修改,對應(yīng)用程序源代碼毫無影響。(3).存儲過程能實(shí)現(xiàn)較快的執(zhí)行速度。如果某一操作包含大量的transaction-sql代碼或分別被多次執(zhí)行,那么存儲過程要比批處理的執(zhí)行速度快很多。因?yàn)榇鎯^程是預(yù)編譯的。 在首次運(yùn)行一個(gè)存儲過程時(shí)查詢,優(yōu)化器對其進(jìn)行分析優(yōu)化,并且給出最終被存儲在系統(tǒng)表中的執(zhí)行計(jì)劃。而

3、批處理的transaction-sql語句在每次運(yùn)行時(shí)都要進(jìn)行編譯和優(yōu)化,速度相對要慢一些。(4).存儲過程能過減少網(wǎng)絡(luò)流量。針對同一個(gè)數(shù)據(jù)庫對象的操作(如查詢、修改) ,如果這一操作所涉及的transaction-sql語句被組織程存儲過程, 那么當(dāng)在客戶計(jì)算機(jī)上調(diào)用該存儲過程時(shí),網(wǎng)絡(luò)中傳送的只是該調(diào)用語句, 從而大大增加了網(wǎng)絡(luò)流量并降低了網(wǎng)絡(luò)負(fù)載。(5).存儲過程可被作為一種安全機(jī)制來充分利用。系統(tǒng)管理員通過執(zhí)行某一存儲過程的權(quán)限進(jìn)行限制, 能夠?qū)崿F(xiàn)對相應(yīng)的數(shù)據(jù)的訪問權(quán)限的限制,避免了非授權(quán)用戶對數(shù)據(jù)的訪問,保證了數(shù)據(jù)的安全。2. 關(guān)于 mysql 的存儲過程存儲過程是數(shù)據(jù)庫存儲的一個(gè)重要

4、的功能,但是mysql 在5.0以前并不支持存儲過程,這使得 mysql 在應(yīng)用上大打折扣。好在mysql 5.0 終于開始已經(jīng)支持存儲過程,這樣即可以大大提高數(shù)據(jù)庫的處理速度,同時(shí)也可以提高數(shù)據(jù)庫編程的靈活性。3. mysql 存儲過程的創(chuàng)建(1). 格式mysql 存儲過程創(chuàng)建的格式: create procedure 過程名 (過程參數(shù),.) 特性 . 過程體這里先舉個(gè)例子:mysql delimiter / mysql create procedure proc1(out s int) - begin - select count(*) into s from user; - end

5、- / mysql delimiter ; 注: (1) 這里需要注意的是delimiter / 和 delimiter ; 兩句,delimiter是分割符的意思,因?yàn)閙ysql 默認(rèn)以 ;為分隔符,如果我們沒有聲明分割符,那么編譯器會把存儲過程當(dāng)成sql 語句進(jìn)行處理,則存儲過程的編譯過程會報(bào)錯(cuò),所以要事先用 delimiter 關(guān)鍵字申明當(dāng)前段分隔符,這樣mysql 才會將;當(dāng)做存儲過程中的代碼,不會執(zhí)行這些代碼,用完了之后要把分隔符還原。(2)存儲過程根據(jù)需要可能會有輸入、輸出、輸入輸出參數(shù),這里有一個(gè)輸出參數(shù) s,類型是 int 型,如果有多個(gè)參數(shù)用 ,分割開。(3)過程體的開始與結(jié)

6、束使用begin 與 end 進(jìn)行標(biāo)識。這樣,我們的一個(gè) mysql 存儲過程就完成了,是不是很容易呢?看不懂也沒關(guān)系,接下來,我們詳細(xì)的講解。(2). 聲明分割符其實(shí),關(guān)于聲明分割符,上面的注解已經(jīng)寫得很清楚,不需要多說,只是稍微要注意一點(diǎn)的是: 如果是用 mysql 的 administrator 管理工具時(shí), 可以直接創(chuàng)建,不再需要聲明。(3). 參數(shù)mysql 存儲過程的參數(shù)用在存儲過程的定義,共有三種參數(shù)類型,in,out,inout, 形式如:create procedure(in |out |inout 參數(shù)名 數(shù)據(jù)類形 .)in 輸入?yún)?shù) :表示該參數(shù)的值必須在調(diào)用存儲過程時(shí)指

7、定,在存儲過程中修改該參數(shù)的值不能被返回,為默認(rèn)值out 輸出參數(shù) :該值可在存儲過程內(nèi)部被改變,并可返回inout輸入輸出參數(shù) :調(diào)用時(shí)指定,并且可被改變和返回. in 參數(shù)例子創(chuàng)建:mysql delimiter / mysql create procedure demo_in_parameter(in p_in int) - begin - select p_in; - set p_in=2; - select p_in; - end; - / mysql delimiter ; 執(zhí)行結(jié)果 : mysql set p_in=1; mysql call demo_in_parameter(

8、p_in); +-+ | p_in | +-+ | 1 | +-+ +-+ | p_in | +-+ | 2 | +-+ mysql select p_in; +-+ | p_in | +-+ | 1 | +-+ 以上可以看出, p_in 雖然在存儲過程中被修改,但并不影響p_id 的值.out 參數(shù)例子創(chuàng)建:mysql delimiter / mysql create procedure demo_out_parameter(out p_out int) - begin - select p_out; - set p_out=2; - select p_out; - end; - / mys

9、ql delimiter ; 執(zhí)行結(jié)果 : mysql set p_out=1; mysql call sp_demo_out_parameter(p_out); +-+ | p_out | +-+ | null | +-+ +-+ | p_out | +-+ | 2 | +-+ mysql select p_out; +-+ | p_out | +-+ | 2 | +-+ . inout 參數(shù)例子創(chuàng)建: mysql delimiter / mysql create procedure demo_inout_parameter(inout p_inout int) - begin - sele

10、ct p_inout; - set p_inout=2; - select p_inout; - end; - / mysql delimiter ; 執(zhí)行結(jié)果 : mysql set p_inout=1; mysql call demo_inout_parameter(p_inout) ; +-+ | p_inout | +-+ | 1 | +-+ +-+ | p_inout | +-+ | 2 | +-+ mysql select p_inout; +-+ | p_inout | +-+ | 2 | +-+ (4). 變量. 變量定義declare variable_name ,varia

11、ble_name. datatype default value;其中, datatype為 mysql 的數(shù)據(jù)類型,如 :int, float, date, varchar(length)例如: declare l_int int unsigned default 4000000; declare l_numeric number(8,2) default 9.95; declare l_date date default 1999-12-31; declare l_datetime datetime default 1999-12-31 23:59:59; declare l_varcha

12、r varchar(255) default this will not be padded; . 變量賦值set 變量名 = 表達(dá)式值,variable_name = expression . 用戶變量. 在 mysql 客戶端使用用戶變量mysql select hello world into x; mysql select x; +-+ | x | +-+ | hello world | +-+ mysql set y=goodbye cruel world; mysql select y; +-+ | y | +-+ | goodbye cruel world | +-+ mysql

13、 set z=1+2+3; mysql select z; +-+ | z | +-+ | 6 | +-+ . 在存儲過程中使用用戶變量mysql create procedure greetworld( ) select concat(greeting, world); mysql set greeting=hello; mysql call greetworld( ); +-+ | concat(greeting, world) | +-+ | hello world | +-+ .在存儲過程間傳遞全局范圍的用戶變量mysql create procedure p1() set last_

14、procedure=p1; mysql create procedure p2() select concat(last procedure was ,last_proc); mysql call p1( ); mysql call p2( ); +-+ | concat(last procedure was ,last_proc | +-+ | last procedure was p1 | +-+ 注意:用戶變量名一般以 開頭濫用用戶變量會導(dǎo)致程序難以理解及管理(5). 注釋mysql 存儲過程可使用兩種風(fēng)格的注釋雙模杠: -該風(fēng)格一般用于單行注釋c 風(fēng)格: 一般用于多行注釋例如:mysq

15、l delimiter / mysql create procedure proc1 -name 存儲過程名- (in parameter1 integer) - begin - declare variable1 char(10); - if parameter1 = 17 then - set variable1 = birds; - else - set variable1 = beasts; - end if; - insert into table1 values (variable1); - end - / mysql delimiter ; 4. mysql 存儲過程的調(diào)用用 c

16、all 和你過程名以及一個(gè)括號,括號里面根據(jù)需要,加入?yún)?shù),參數(shù)包括輸入?yún)?shù)、輸出參數(shù)、輸入輸出參數(shù)。具體的調(diào)用方法可以參看上面的例子。5. mysql 存儲過程的查詢我們像知道一個(gè)數(shù)據(jù)庫下面有那些表,我們一般采用show tables; 進(jìn)行查看。那么我們要查看某個(gè)數(shù)據(jù)庫下面的存儲過程,是否也可以采用呢?答案是, 我們可以查看某個(gè)數(shù)據(jù)庫下面的存儲過程,但是是令一鐘方式。我們可以用select name from c where db=數(shù)據(jù)庫名 ;或者select routine_name from information_schema.routines where rout

17、ine_schema=數(shù)據(jù)庫名 ;或者show procedure status where db= 數(shù)據(jù)庫名 ;進(jìn)行查詢。如果我們想知道,某個(gè)存儲過程的詳細(xì),那我們又該怎么做呢?是不是也可以像操作表一樣用describe 表名進(jìn)行查看呢?答案是:我們可以查看存儲過程的詳細(xì),但是需要用另一種方法:show create procedure 數(shù)據(jù)庫 .存儲過程名 ;就可以查看當(dāng)前存儲過程的詳細(xì)。6. mysql 存儲過程的修改alter procedure更改用 create procedure 建立的預(yù)先指定的存儲過程,其不會影響相關(guān)存儲過程或存儲功能。7. mysql 存儲過程的刪除刪除一個(gè)

18、存儲過程比較簡單,和刪除表一樣:drop procedure從 mysql 的表格中刪除一個(gè)或多個(gè)存儲過程。8. mysql 存儲過程的控制語句(1). 變量作用域內(nèi)部的變量在其作用域范圍內(nèi)享有更高的優(yōu)先權(quán),當(dāng)執(zhí)行到end。變量時(shí),內(nèi)部變量消失,此時(shí)已經(jīng)在其作用域外,變量不再可見了,應(yīng)為在存儲過程外再也不能找到這個(gè)申明的變量,但是你可以通過out 參數(shù)或者將其值指派給會話變量來保存其值。mysql delimiter / mysql create procedure proc3() - begin - declare x1 varchar(5) default outer; - begin -

19、 declare x1 varchar(5) default inner; - select x1; - end; - select x1; - end; - / mysql delimiter ; (2). 條件語句. if-then -else語句mysql delimiter / mysql create procedure proc2(in parameter int) - begin - declare var int; - set var=parameter+1; - if var=0 then - insert into t values(17); - end if; - if

20、parameter=0 then - update t set s1=s1+1; - else - update t set s1=s1+2; - end if; - end; - / mysql delimiter ; . case 語句:mysql delimiter / mysql create procedure proc3 (in parameter int) - begin - declare var int; - set var=parameter+1; - case var - when 0 then - insert into t values(17); - when 1 t

21、hen - insert into t values(18); - else - insert into t values(19); - end case; - end; - / mysql delimiter ; (3). 循環(huán)語句. while end while :mysql delimiter / mysql create procedure proc4() - begin - declare var int; - set var=0; - while var insert into t values(var); - set var=var+1; - end while; - end;

22、 - / mysql delimiter ; . repeat end repeat :它在執(zhí)行操作后檢查結(jié)果,而while 則是執(zhí)行前進(jìn)行檢查。mysql delimiter / mysql create procedure proc5 () - begin - declare v int; - set v=0; - repeat - insert into t values(v); - set v=v+1; - until v=5 - end repeat; - end; - / mysql delimiter ; . loop end loop:loop 循環(huán)不需要初始條件,這點(diǎn)和whi

23、le 循環(huán)相似,同時(shí)和repeat 循環(huán)一樣不需要結(jié)束條件 , leave 語句的意義是離開循環(huán)。mysql delimiter / mysql create procedure proc6 () - begin - declare v int; - set v=0; - loop_lable:loop - insert into t values(v); - set v=v+1; - if v =5 then - leave loop_lable; - end if; - end loop; - end; - / mysql delimiter ; . lables標(biāo)號:標(biāo)號可以用在 beg

24、in repeat while或者 loop 語句前,語句標(biāo)號只能在合法的語句前面使用??梢蕴鲅h(huán),使運(yùn)行指令達(dá)到復(fù)合語句的最后一步。(4). iterate 迭代. iterate:通過引用復(fù)合語句的標(biāo)號,來從新開始復(fù)合語句mysql delimiter / mysql create procedure proc10 () - begin - declare v int; - set v=0; - loop_lable:loop - if v=3 then - set v=v+1; - iterate loop_lable; - end if; - insert into t values

25、(v); - set v=v+1; - if v=5 then - leave loop_lable; - end if; - end loop; - end; - / mysql delimiter ; 9. mysql 存儲過程的基本函數(shù)(1).字符串類charset(str) /返回字串字符集concat (string2 ,. ) /連接字串instr (string ,substring ) /返回 substring首次在 string中出現(xiàn)的位置 ,不存在返回 0 lcase (string2 ) /轉(zhuǎn)換成小寫left (string2 ,length ) /從 string2中

26、的左邊起取 length 個(gè)字符length (string ) /string 長度load_file (file_name ) / 從文件讀取內(nèi)容locate (substring , string ,start_position ) 同 instr,但可指定開始位置lpad (string2 ,length ,pad ) /重復(fù)用 pad加在 string 開頭,直到字串長度為 length ltrim (string2 ) / 去除前端空格repeat (string2 ,count ) /重復(fù) count 次replace (str ,search_str ,replace_str

27、) / 在 str 中用 replace_str替換 search_str rpad (string2 ,length ,pad) /在 str 后用 pad補(bǔ)充,直到長度為 length rtrim (string2 ) / 去除后端空格strcmp (string1 ,string2 ) /逐字符比較兩字串大小 , substring (str , position ,length ) / 從 str 的 position 開始,取 length個(gè)字符 , 注:mysql 中處理字符串時(shí),默認(rèn)第一個(gè)字符下標(biāo)為1,即參數(shù) position 必須大于等于1mysql select substr

28、ing(abcd,0,2); +-+ | substring(abcd,0,2) | +-+ | | +-+ 1 row in set (0.00 sec) mysql select substring(abcd,1,2); +-+ | substring(abcd,1,2) | +-+ | ab | +-+ 1 row in set (0.02 sec) trim(both|leading|trailing padding fromstring2) /去除指定位置的指定字符ucase (string2 ) /轉(zhuǎn)換成大寫right(string2,length) /取 string2最后 le

29、ngth 個(gè)字符space(count) /生成 count個(gè)空格(2).數(shù)學(xué)類abs (number2 ) /絕對值bin (decimal_number ) /十進(jìn)制轉(zhuǎn)二進(jìn)制ceiling (number2 ) / 向上取整conv(number2,from_base,to_base) / 進(jìn)制轉(zhuǎn)換floor (number2 ) /向下取整format (number,decimal_places ) / 保留小數(shù)位數(shù)hex (decimalnumber ) /轉(zhuǎn)十六進(jìn)制注:hex()中可傳入字符串,則返回其asc-11碼,如 hex(def) 返回4142143 也可以傳入十進(jìn)制整數(shù),

30、返回其十六進(jìn)制編碼,如hex(25)返回19 least (number , number2 ,.) /求最小值mod (numerator ,denominator ) /求余power (number ,power ) /求指數(shù)rand(seed) /隨機(jī)數(shù)round (number ,decimals ) /四舍五入 ,decimals為小數(shù)位數(shù) 注:返回類型并非均為整數(shù),如:(1)默認(rèn)變?yōu)檎沃祄ysql select round(1.23); +-+ | round(1.23) | +-+ | 1 | +-+ 1 row in set (0.00 sec) mysql select round(1.56); +-+ | round(1.56) | +-+ | 2 | +-+ 1 row in set (0.00 sec) (2)可以設(shè)定小數(shù)位數(shù),返回浮點(diǎn)型數(shù)據(jù)mysql select round(1.567,2); +-+ | round(1.567,2) | +-+ | 1.57 | +-+ 1 row in set (0.00 sec) sign (number2 ) / (3).日期時(shí)間類addtime (date2 ,time_interval ) /將 time_interval

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論