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

下載本文檔

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

文檔簡(jiǎn)介

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

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

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

4、的功能,但是mysql 在5.0以前并不支持存儲(chǔ)過(guò)程,這使得 mysql 在應(yīng)用上大打折扣。好在mysql 5.0 終于開始已經(jīng)支持存儲(chǔ)過(guò)程,這樣即可以大大提高數(shù)據(jù)庫(kù)的處理速度,同時(shí)也可以提高數(shù)據(jù)庫(kù)編程的靈活性。3. mysql 存儲(chǔ)過(guò)程的創(chuàng)建(1). 格式mysql 存儲(chǔ)過(guò)程創(chuàng)建的格式: create procedure 過(guò)程名 (過(guò)程參數(shù),.) 特性 . 過(guò)程體這里先舉個(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)以 ;為分隔符,如果我們沒(méi)有聲明分割符,那么編譯器會(huì)把存儲(chǔ)過(guò)程當(dāng)成sql 語(yǔ)句進(jìn)行處理,則存儲(chǔ)過(guò)程的編譯過(guò)程會(huì)報(bào)錯(cuò),所以要事先用 delimiter 關(guān)鍵字申明當(dāng)前段分隔符,這樣mysql 才會(huì)將;當(dāng)做存儲(chǔ)過(guò)程中的代碼,不會(huì)執(zhí)行這些代碼,用完了之后要把分隔符還原。(2)存儲(chǔ)過(guò)程根據(jù)需要可能會(huì)有輸入、輸出、輸入輸出參數(shù),這里有一個(gè)輸出參數(shù) s,類型是 int 型,如果有多個(gè)參數(shù)用 ,分割開。(3)過(guò)程體的開始與結(jié)

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

7、定,在存儲(chǔ)過(guò)程中修改該參數(shù)的值不能被返回,為默認(rèn)值out 輸出參數(shù) :該值可在存儲(chǔ)過(guò)程內(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 雖然在存儲(chǔ)過(guò)程中被修改,但并不影響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 | +-+ . 在存儲(chǔ)過(guò)程中使用用戶變量mysql create procedure greetworld( ) select concat(greeting, world); mysql set greeting=hello; mysql call greetworld( ); +-+ | concat(greeting, world) | +-+ | hello world | +-+ .在存儲(chǔ)過(guò)程間傳遞全局范圍的用戶變量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 | +-+ 注意:用戶變量名一般以 開頭濫用用戶變量會(huì)導(dǎo)致程序難以理解及管理(5). 注釋mysql 存儲(chǔ)過(guò)程可使用兩種風(fēng)格的注釋雙模杠: -該風(fēng)格一般用于單行注釋c 風(fēng)格: 一般用于多行注釋例如:mysq

15、l delimiter / mysql create procedure proc1 -name 存儲(chǔ)過(guò)程名- (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 存儲(chǔ)過(guò)程的調(diào)用用 c

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

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

18、存儲(chǔ)過(guò)程比較簡(jiǎn)單,和刪除表一樣:drop procedure從 mysql 的表格中刪除一個(gè)或多個(gè)存儲(chǔ)過(guò)程。8. mysql 存儲(chǔ)過(guò)程的控制語(yǔ)句(1). 變量作用域內(nèi)部的變量在其作用域范圍內(nèi)享有更高的優(yōu)先權(quán),當(dāng)執(zhí)行到end。變量時(shí),內(nèi)部變量消失,此時(shí)已經(jīng)在其作用域外,變量不再可見(jiàn)了,應(yīng)為在存儲(chǔ)過(guò)程外再也不能找到這個(gè)申明的變量,但是你可以通過(guò)out 參數(shù)或者將其值指派給會(huì)話變量來(lái)保存其值。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). 條件語(yǔ)句. if-then -else語(yǔ)句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 語(yǔ)句: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)語(yǔ)句. 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 語(yǔ)句的意義是離開循環(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)號(hào):標(biāo)號(hào)可以用在 beg

24、in repeat while或者 loop 語(yǔ)句前,語(yǔ)句標(biāo)號(hào)只能在合法的語(yǔ)句前面使用。可以跳出循環(huán),使運(yùn)行指令達(dá)到復(fù)合語(yǔ)句的最后一步。(4). iterate 迭代. iterate:通過(guò)引用復(fù)合語(yǔ)句的標(biāo)號(hào),來(lái)從新開始復(fù)合語(yǔ)句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 存儲(chǔ)過(guò)程的基本函數(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 長(zhǎng)度load_file (file_name ) / 從文件讀取內(nèi)容locate (substring , string ,start_position ) 同 instr,但可指定開始位置lpad (string2 ,length ,pad ) /重復(fù)用 pad加在 string 開頭,直到字串長(zhǎng)度為 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ǔ)充,直到長(zhǎng)度為 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 ) /絕對(duì)值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. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論