欧美阿v视频在线大全_亚洲欧美中文日韩V在线观看_www性欧美日韩欧美91_亚洲欧美日韩久久精品

主頁 > 知識庫 > 細談Mysql的存儲過程和存儲函數

細談Mysql的存儲過程和存儲函數

熱門標簽:自己做地圖標注需要些什么 福建外呼電銷機器人加盟 徐涇鎮騰訊地圖標注 天津公司外呼系統軟件 電話機器人的價格多少錢一個月 400電話申請廠家現貨 百度地圖標注要什么軟件 中國地圖標注公司 昌德訊外呼系統

1 存儲過程

1.1 什么是存儲過程

存儲過程是一組為了完成某項特定功能的sql語句集,其實質上就是一段存儲在數據庫中的代碼,他可以由聲明式的sql語句(如CREATE,UPDATE,SELECT等語句)和過程式sql語句(如IF...THEN...ELSE控制結構語句)組成。存儲過程思想上很簡單,就是數據庫 SQL 語言層面的代碼封裝與重用。

1.2 存儲過程的優缺點

優點:

1.可增強sql語言的功能和靈活性
存儲過程可以用流程控制語言編寫,有很強的靈活性,可以完成復雜的判斷和較復雜的運算。

2.良好的封裝性
存儲過程被創建后,可以在程序中被多次調用,而不必擔心重寫編寫該存儲過程的sql語句。

3.高性能
存儲過程執行一次后,其執行規劃就駐留在高速緩沖存儲器中,以后的操作中只需要從高速緩沖器中調用已編譯好的二進制代碼執行即可,從而提高了系統性能。

缺點:

存儲過程,往往定制化于特定的數據庫上,因為支持的編程語言不同。當切換到其他廠商的數據庫系統時,需要重寫原有的存儲過程。

1.3 創建存儲過程

1.3.1 DELIMITER定界符

在sql中服務器處理sql語句默認是以分號作為語句的結束標志,然而在創建存儲過程時,存儲過程體中可能包含多條sql語句,這些sql語句如果仍以分號作為語句結束符,那么服務器在處理時會以第一條sql語句處的分號作為整個程序的結束符,而不再去處理后面的sql。
為解決這個問題,通常使用DELIMITER命令,將sql語句的結束符臨時修改為其他符號。

DELIMITER語法格式:

DELIMITER $$

$$是用戶定義的結束符,通常這個符號可以是一些特殊的符號。另外應避免使用反斜杠,因為他是轉義字符。
若希望換回默認的分號作為結束標記,只需再在命令行輸入下面的sql語句即可。

DELIMITER ;

1.3.2 存儲過程創建

在Mysql中,使用CREATE PROCEDURE語句來創建存儲過程。

CREATE PROCEDURE p_name([proc_parameter[,...]])
routine_body

其中,語法項“proc_parameter”的語法格式是:

[IN|OUT|INOUT]parame_name type

1."p_name"用于指定存儲過程的名稱。

2."proc_parameter"用于指定存儲過程中的參數列表。其中,語法項"parame_name"為參數名,"type"為參數的類型(類型可以是Mysql中任意的有效數據類型)。Mysql的存儲過程支持三種類型的參數,即輸入參數IN,輸出參數OUT,輸入輸出參數INOUT。輸入參數是使數據可以傳遞給一個存儲過程;輸出參數是用于存儲過程需要返回的一個操作結果;輸入輸出參數既可以充當輸入參數也可以充當輸出結果。
參數的取名不要和表中的列名相同,否則盡管不會返回出錯信息,但儲存過程中的sql語句會將參數名當做列名,從而引發不可預知的錯誤。

3.語法項"rountine_body"表示存儲過程的主體部分,也成為存儲過程體,其包含了需要執行的sql。過程體以關鍵字BEGIN開始,以關鍵字END結束。若只有一條sql可以忽略BEGIN....END標志。

1.3.3 局部變量

在存儲過程體中可以聲明局部變量,用來存儲過程體中的臨時結果。在Mysql中使用DECLARE語句來聲明局部變量。

DECLARE var_name type [DEFAULT value]

"var_name"用于指定局部變量的名稱;"type"用來聲明變量的類型;"DEFAULT"用來指定默認值,如果沒有指定則為NULL。

注意:局部變量只能在存儲過程體的BEGIN...END語句塊中;局部變量必須在存儲過程體的開頭處聲明;局部變量的作用范圍僅限于聲明它的BEGIN...END語句塊,其他語句塊中的語句不可以使用它。

1.3.4 用戶變量

用戶變量一般以@開頭。

注意:濫用用戶變量會導致程序難以理解及管理。

1.3.5 SET語句

在Mysql中通過SET語句對局部變量賦值,其格式是:

SET var_name = expr[,var_name2 = expr]....

1.3.6 SELECT....INTO語句

在Mysql中,可以使用SELECT...INTO語句把選定的列的值存儲到局部變量中。格式是:

SELECT col_name[,..] INTO var_name[,....] table_expr

其中"col_name"用于指定列名;"var_name"用于指定要賦值的變量名;"table_expr"表示SELECT語句中FROM后面的部分。

注意:SELECT...INTO語句返回的結果集只能有一行數據。

1.3.7 流程控制語句

條件判斷語句

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 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 then 
 -> insert into t values(18); 
 -> else 
 -> insert into t values(19); 
 -> end case; 
 -> end; 
 ->  
mysql > DELIMITER ; 

循環語句
while ···· end while:

mysql > DELIMITER  
mysql > CREATE PROCEDURE proc4() 
 -> begin 
 -> declare var int; 
 -> set var=0; 
 -> while var6 do 
 -> insert into t values(var); 
 -> set var=var+1; 
 -> end while; 
 -> end; 
 ->  
mysql > DELIMITER ;

repeat···· end repea:

它在執行操作后檢查結果,而 while 則是執行前進行檢查。

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 ;
repeat
 --循環體
 until 循環條件 
end repeat;

loop ·····endloop:

loop 循環不需要初始條件,這點和 while 循環相似,同時和 repeat 循環一樣不需要結束條件, leave 語句的意義是離開循環。

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 ;

ITERATE迭代:

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(v); 
 -> set v=v+1; 
 -> if v>=5 then 
 -> leave LOOP_LABLE; 
 -> end if; 
 -> end loop; 
 -> end; 
 ->  
mysql > DELIMITER ;

1.3.8 游標

MySQL中的游標可以理解成一個可迭代對象(類比Python中的列表、字典等可迭代對象),它可以用來存儲select 語句查詢到的結果集,這個結果集可以包含多行數據,從而使我們可以使用迭代的方法從游標中依次取出每行數據。

MySQL游標的特點:
1.只讀:無法通過光標更新基礎表中的數據。
2.不可滾動:只能按照select語句確定的順序獲取行。不能以相反的順序獲取行。 此外,不能跳過行或跳轉到結果集中的特定行。
3.敏感:有兩種游標:敏感游標和不敏感游標。敏感游標指向實際數據,不敏感游標使用數據的臨時副本。敏感游標比一個不敏感的游標執行得更快,因為它不需要臨時拷貝數據。MySQL游標是敏感的。

1.聲明游標

游標聲明必須在變量聲明之后。如果在變量聲明之前聲明游標,MySQL將會發出一個錯誤。游標必須始終與select語句相關聯。

declare cursor_name cursor for select_statement;

2.打開游標

使用open語句打開游標,只有先打開游標才能讀取數據。

open cursor_name;

3.讀取游標

使用fetch語句來檢索游標指向的一行數據,并將游標移動到結果集中的下一行。

fetch cursor_name into var_name;

4.關閉游標

使用close語句關閉游標。

close cursor_name;

當游標不再使用時,應該關閉它。   當使用MySQL游標時,還必須聲明一個notfound處理程序來處理當游標找不到任何行時的情況。 因為每次調用fetch語句時,游標會嘗試依次讀取結果集中的每一行數據。 當游標到達結果集的末尾時,它將無法獲得數據,并且會產生一個條件。 處理程序用于處理這種情況。

declare continue handler for not found set type = 1;

type是一個變量,示游標到達結果集的結尾。

delimiter $$
create PROCEDURE phoneDeal()
BEGIN
 DECLARE id varchar(64); -- id
 DECLARE phone1 varchar(16); -- phone
 DECLARE password1 varchar(32); -- 密碼
 DECLARE name1 varchar(64); -- id
 -- 遍歷數據結束標志
 DECLARE done INT DEFAULT FALSE;
 -- 游標
 DECLARE cur_account CURSOR FOR select phone,password,name from account_temp;
 -- 將結束標志綁定到游標
 DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
 
 -- 打開游標
 OPEN cur_account; 
 -- 遍歷
 read_loop: LOOP
 -- 取值 取多個字段
 FETCH NEXT from cur_account INTO phone1,password1,name1;
 IF done THEN
 LEAVE read_loop;
 END IF;
 
 -- 你自己想做的操作
 insert into account(id,phone,password,name) value(UUID(),phone1,password1,CONCAT(name1,'的家長'));
 END LOOP;
 
 -- 關閉游標
 CLOSE cur_account;
END $$

1.3.7 調用存儲過程

使用call語句調用存儲過程

call sp_name[(傳參)];

1.3.8 刪除存儲過程

使用drop語句刪除存儲過程

DROP PROCEDURE sp_name

2 存儲函數

2.1 什么是存儲函數

存儲函數和存儲過程一樣,都是sql和語句組成的代碼塊。
存儲函數不能有輸入參數,并且可以直接調用,不需要call語句,且必須有一條包含RETURN語句。

2.2 創建存儲函數

在Mysql中使用CREATE FUNCTION語句創建:

CREATE FUNCTION fun_name (par_name type[,...])
RETURNS type
[characteristics] 
fun_body

其中,fun_name為函數名,并且名字唯一,不能與存儲過程重名。par_name是指定的參數,type為參數類型;RETURNS字句用來聲明返回值和返回值類型。fun_body是函數體,所有存儲過程中的sql在存儲函數中同樣可以使用。但是存儲函數體中必須包含一個RETURN 語句。
characteristics指定存儲過程的特性,有以下取值:

  • LANGUAGE SQL:說明routine_body部分是由SQL語句組成的,當前系統支持的語言為SQL,SQL是LANGUAGE特性的唯一值。
  • [NOT] DETERMINISTIC:指明存儲過程執行的結果是否確定。DETERMINISTIC表示結果是確定的,每次執行存儲過程時,相同的輸入會得到相同的輸出,NOT DETERMINISTIC表示結果是不確定的,相同的輸入可能得到不同的輸出,如果沒有指定任意一個值,默認為NOT DETERMINISTIC。
  • [CONTAINS SQL|NO SQL|READS SQL DATA|MODIFIES SQL DATA]:指明子程序使用SQL語句的限制。CONTAINS SQL表明子程序包含SQL語句,但不包含讀寫數據語句;NO SQL表明子程序不包含SQL語句;READS SQL DATA說明子程序包含讀數據的語句;MODIFIES SQL DATA表名子程序包含寫數據的語句。默認情況下,系統會指定為CONTAINS SQL。
  • SQL SECURITY[DEFINER|INVOKER]:指明誰有權限來執行。DEFINER表示只有定義著才能執行。INVOKER表示用友權限的調用者可以執行。默認情況下,系統指定為DEFINER。
  • COMMENT 'string':注釋信息,用來描述存儲過程或函數。
delimiter $$
create function getAnimalName(animalId int) RETURNS VARCHAR(50)
DETERMINISTIC
begin
 declare name VARCHAR(50);
 set name=(select name from animal where id=animalId);
 return (name);
end$$
delimiter;
-- 調用
select getAnimalName(4)

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

您可能感興趣的文章:
  • MySQL自定義函數和存儲過程示例詳解
  • 詳解MySql存儲過程參數的入門使用
  • mysql創建存儲過程實現往數據表中新增字段的方法分析
  • MYSQL的存儲過程和函數簡單寫法

標簽:荊門 駐馬店 鄂爾多斯 梅河口 昌都 陜西 北京 黔西

巨人網絡通訊聲明:本文標題《細談Mysql的存儲過程和存儲函數》,本文關鍵詞  細談,Mysql,的,存儲,過程,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《細談Mysql的存儲過程和存儲函數》相關的同類信息!
  • 本頁收集關于細談Mysql的存儲過程和存儲函數的相關信息資訊供網民參考!
  • 推薦文章
    欧美阿v视频在线大全_亚洲欧美中文日韩V在线观看_www性欧美日韩欧美91_亚洲欧美日韩久久精品
  • <rt id="w000q"><acronym id="w000q"></acronym></rt>
  • <abbr id="w000q"></abbr>
    <rt id="w000q"></rt>
    北条麻妃在线观看视频| 久久久久成人精品无码中文字幕| 极品白嫩丰满美女无套| 欧美日韩成人一区二区| 亚洲欧美偷拍三级| 不卡大黄网站免费看| www.97视频| 国产精品久久久久久久久免费相片| 经典三级视频一区| 欧美精品日韩在线| 国产嫩草影院久久久久| 国产精品自拍在线| 色偷偷www8888| 国产精品久久久久久久久免费相片| 成人一级片网址| 加勒比婷婷色综合久久| 中文字幕在线视频一区| 成人黄色a**站在线观看| 国语对白在线播放| **性色生活片久久毛片| 972aa.com艺术欧美| 欧美最猛性xxxxx直播| 亚洲综合久久av| 色哟哟无码精品一区二区三区| 欧美精品久久久久久久多人混战| 天天影视色香欲综合网老头| 朝桐光av一区二区三区| 插我舔内射18免费视频| 朝桐光av在线| 伊人性伊人情综合网| 亚洲少妇一区二区| 欧美男女性生活在线直播观看| 婷婷综合在线观看| 免费看黄色的视频| 国产精品午夜在线观看| 99久久精品99国产精品| 欧美日韩免费电影| 美女脱光内衣内裤视频久久网站| 日本免费www| 1024成人网色www| 成人做爰69片免费| 精品国产乱码久久久久久夜甘婷婷| 国产专区欧美精品| 色欧美片视频在线观看在线视频| 亚洲一级在线观看| 亚洲精品午夜视频| 欧洲性xxxx| 亚洲欧美在线视频| xfplay5566色资源网站| 久久综合九色综合久久久精品综合 | √…a在线天堂一区| 日本一级大毛片a一| 精品国产精品一区二区夜夜嗨| 国产成人高清视频| 欧美日韩精品一区二区| 久久精品72免费观看| 老女人性淫交视频| 亚洲aaa精品| 日韩av网站在线播放| 一区二区免费看| 99久久久无码国产精品性| 中文字幕在线视频一区| 波多野结衣有码| 中文文精品字幕一区二区| 国产精品熟妇一区二区三区四区| 久久久久久久久久久黄色| 91色视频在线| 久久免费精品国产久精品久久久久| 99国产精品久久久久久久久久久| 欧美大白屁股肥臀xxxxxx| av在线一区二区三区| 日韩一级大片在线观看| 成人高清av在线| 精品毛片乱码1区2区3区| 不卡av在线网| 久久综合狠狠综合| 性高潮免费视频| 欧美国产1区2区| 影音先锋黄色资源| 最好看的中文字幕久久| 免费污网站在线观看| 一区二区三区电影在线播| wwwww黄色| 日韩精品国产欧美| 日本精品免费观看高清观看| 久久se这里有精品| 欧美精选午夜久久久乱码6080| 国产jizzjizz一区二区| 欧美成人aa大片| 久久久久亚洲av无码麻豆| 国产欧美日韩在线| 国产全是老熟女太爽了| 亚洲综合小说图片| 91视频综合网| 国产专区欧美精品| 欧美va亚洲va| 亚洲精品亚洲人成人网| 手机看片福利视频| 日韩中文字幕1| 欧美视频在线观看一区| 成人性生交大片| 欧美精品一区二区久久久| 中文字幕天堂av| 亚洲免费在线播放| 91视频青青草| 国产精品自拍三区| 久久久久久久久97黄色工厂| 黄色片视频免费观看| 亚洲综合男人的天堂| 午夜av入18在线| 夫妻av一区二区| 久久久精品日韩欧美| 3d动漫精品啪啪一区二区下载| 亚洲午夜激情网站| 在线视频你懂得一区二区三区| 处破女av一区二区| 国产精品私人自拍| 99精品中文字幕| 国产一区二区三区日韩| 精品久久久久一区| 受虐m奴xxx在线观看| 免费观看91视频大全| 日韩一区二区三区在线| 精品一区二区视频在线观看| 午夜成人免费电影| 欧美一级黄色大片| 中文字幕 亚洲一区| 美女免费视频一区二区| 欧美成人a在线| 91资源在线播放| 国产美女在线观看一区| 国产日本一区二区| 国产美女高潮视频| www.激情成人| 一区二区在线观看免费| 在线精品亚洲一区二区不卡| 91蝌蚪porny| 亚洲国产成人av好男人在线观看| 欧美日韩精品电影| 精品人妻一区二区免费视频| 青青草国产精品亚洲专区无| 日韩免费视频一区二区| 91精品人妻一区二区三区| 国产麻豆视频精品| 国产精品久久久久久久久果冻传媒 | 日韩影院免费视频| 91精品国产综合久久精品麻豆| 粉嫩av懂色av蜜臀av分享| 美国十次综合导航| 久久久精品欧美丰满| 国产成人自拍网站| 91日韩一区二区三区| 亚洲成a人v欧美综合天堂 | 99久久久国产精品免费蜜臀| 亚洲欧美日韩国产成人精品影院| 在线日韩av片| 亚洲精品乱码久久| 精品欧美一区二区三区精品久久| 中文字幕免费看| 国产成人亚洲综合a∨婷婷图片| 国产精品国产三级国产普通话99| 在线亚洲高清视频| 一级欧美一级日韩片| 经典三级一区二区| 综合久久综合久久| 69久久99精品久久久久婷婷| 99久久人妻无码精品系列| 国产传媒日韩欧美成人| 亚洲免费在线视频| 日韩欧美专区在线| 情侣偷拍对白清晰饥渴难耐| 95精品视频在线| 日本aⅴ免费视频一区二区三区| www国产亚洲精品久久麻豆| 看免费黄色录像| 日本人添下边视频免费| 国产自产2019最新不卡| 亚洲日本成人在线观看| 欧美一卡二卡在线| 男人天堂资源网| 人妻互换一二三区激情视频| 美国精品在线观看| 日韩一区在线播放| 日韩欧美精品在线视频| 免费看特级毛片| 欧美肉大捧一进一出免费视频| 韩国欧美国产1区| 一区二区三区四区亚洲| 精品剧情在线观看| 在线中文字幕不卡| 亚洲ⅴ国产v天堂a无码二区| 91丝袜美腿高跟国产极品老师 | 国产精品综合一区二区三区| 伊人一区二区三区| 久久久久久久综合日本| 欧美日韩亚洲综合在线 欧美亚洲特黄一级| 国产精品成人无码免费| 国产又黄又嫩又滑又白| 国产精品综合一区二区三区| 日韩在线卡一卡二|