亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 數據庫 > MySQL > 正文

MySQL存儲過程和函數的操作(十二)

2024-07-24 13:10:22
字體:
來源:轉載
供稿:網友

數據庫對象表時存儲和操作數據的邏輯結構,而數據庫對象存儲過程和函數,則是用來實現將一組關于表操作的sql語句當作一個整體來執行。在數據庫系統中,當調用存儲過程和函數時,則會執行這些對象中所設置的sql語句組,從而實現相應功能。
1. 為什么使用存儲過程和函數的操作 
    有時針對表的一個完整操作往往不是單條sql語句就可以實現的,而是需要一組sql語句來實現。在具體應用當中,一個完整的操作會包含多條sql語句,在執行過程中需要根據前面sql語句的執行結果有選擇地執行后面sql語句。
    存儲過程和函數可以簡單理解為一條或多條sql語句的集合。存儲過程和函數就是事先經過編譯并存儲在數據庫中的一段sql語句集合。
    存儲過程和函數有什么區別呢?這兩者的主要區別在于函數必須有返回值,而存儲過程則沒有。存儲過程的參數類型遠遠多于函數的參數類型。 

關于存儲過程和函數的優點如下:
      1. 存儲過程和函數允許標準組件式編程,提高了sql語句的重用性、共享性和可移植性。
      2. 存儲過程和函數能夠實現較快的執行速度,能夠減少網絡流量。
      3. 存儲過程和函數可以作為一種安全機制來利用。 

關于存儲過程和函數的缺點如下:
      1. 存儲過程和函數的編寫比單句sql語句復雜,需要用戶有更高的技能和更豐富的經驗。
      2. 在編寫存儲過程和函數時,需要創建這些數據庫對象的權限。=

2. 創建存儲過程和函數 
2.1 創建存儲過程語法形式:

語法形式如下:

create procedure procedure_name([procedure_parameter[,...]])  [characteristic...] routine_body//說明:procedure_name參數表示所要創建的存儲過程的名字,procedure_parameter參數表示存儲過程的參數,characteristic參數表示存儲過程的特性,routine_body參數表示存儲過程的sql語句代碼,可以用begin...end來標志sql語句的開始和結束。//注意:在具體創建存儲過程時,存儲過程名不能和已經存在的存儲過程名重復,推薦存儲過程名為procedure_xxx或者proce_xxx;//procedure_parameter 中每個參數的語法形式為:[IN|OUT|INOUT] parameter_name type//該語句中每個參數由三部分組成,分別為輸入/輸出類型、參數名和參數類型。

characteristic參數的取值為:
language sql
|[not] deterministic
|{constains sql | no sql | reads sql data|modifies sql data}
|sql security {definer | invoker}
|comment 'string'

    1. language sql,表示存儲過程的routine_body部分由sql語言的語句組成。為mysql軟件所有默認的語句。
    2. [not] deterministic,表示存儲過程的執行結果是否確定。如果值是deterministic表示執行結果是確定的。即每次執行存儲過程時,如果輸入相同的參數將得到相同的輸出;如果值為not deterministic,表示執行結果不確定,即相同的輸入可能得到不同的輸出。默認值為deterministic。
    3. {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。
    4. sql security{definer|invoker},設置誰有權限來執行。如果值為definer,表示只有定義者才能執行,如果值為invoker表示調用者可以執行。默認值為definer。
    5. comment ‘string', 表示注釋語句。 

2.2 創建函數語法形式:

語法形式如下:

create function function_name([function_parameter[,...]])  [characteristic...] routine_body

    上述語句中,function_name參數表示所要創建的函數的名字;function_parameter參數表示函數的參數,characteristic參數表示函數的特性,該參數的取值與存儲過程中的取值相同。routine_body參數表示函數的sql語句代碼,可以用begin…end來表示sql語句的開始和結束。

function_parameter中每個參數的語法形式如下:
parameter_name type

    在上述語句中每個參數由兩部分組成,分別為參數名和參數類型。parameter_name表示參數名。type表示參數類型。 

2.3 創建簡單的存儲過程和函數:

//查詢雇員表中所有雇員工資的存儲過程:
示例:

mysql> delimiter $$mysql> delimiter $$ create procedure proce_employee_sal()     comment '查詢所有雇員的工資'     begin      select sal from t_employee;    end $$    dilimiter ;

    通常在創建存儲過程時,通過命令delimiter && 將sql語句的結束符由“;”符號修改成兩個美元符號。這主要是因為sql語句中默認語句結束符為分好(;),即存儲過程中的sql語句也需要用分號來結束,將結束符號修改成兩個美元符之后,就可以在執行過程中避免沖突。不過最后不要忘記將通過命令“delimiter ;”將結束符修改為sql語句中默認的結束符號。

創建函數示例:

delimiter $$create function func_employee_sal (empno int(11)) returns double(10,2) comment '查詢某個雇員的工資' begin return (  select sal from t_employee where t_employee.empno=empno; )end$$delimiter ;

    創建了一個名為func_employee_sal的函數,該函數擁有一個類型為int(11),名為empno的參數,返回值為double(10,2)類型。select語句從t_employee表中查詢empnoo字段值等于所傳入參數empno值的記錄,同時將該條記錄的sal字段的值返回。

3. 關于存儲過程和函數的表達式 

3.1 操作變量:
    變量是表達式語句中最基本的元素,可以用來臨時存儲數據??梢酝ㄟ^變量存儲從表中查詢到的數據。 

    3.1.1 聲明變量:

語法形式如下:
declare var_name[,...] type [default value]

    在上述語句中,var_name參數表示要聲明的變量的名字;參數type表示所要聲明變量的類型;default value用來實現設置變量的默認值,如果無該語句默認值為null。在具體聲明變量時,可以同時定義多個變量。 

    3.1.2 賦值變量:

語法形式如下:
語法一:
set var_name=expr[,...]
語法二:

select filed_name[,...] into var_name[,...]  from table_name    where condition

    var_name參數表示所要賦值變量名字,參數expr是關于變量的賦值表達式。在為變量賦值時,可以同時為多個變量賦值,各個變量的賦值語句之間用逗號隔開。
語法二中將查詢到的結果賦值給變量,參數filed_name表示查詢的字段名,參數var_name表示變量名。將查詢結果賦值給變量,該查詢語句的返回結果只能是單行。

示例:

declare employee_sal int default 1000;declare employee_sal int default 1000;set employee_sal = 3500;select sal into employee_sal from t_employee where empno=7556;

3.2 操作條件:
    3.2.1 定義條件:

語法形式如下:

declare condition_name condition for condition_valuecondition_value:  sqlstate[value] sqlstate_value  |mysql_error_code

condition_name參數表示所要定義的條件名稱;參數condition_value用來實現設置條件的類型;參數sqlstate_value和mysql_error_code用來設置條件的錯誤。 

    3.2.2 定義處理程序:

語法形式為:

declare handler_type handler for condition_value[,...] sp_statementhandler_type:  continue  |exit  |undocondition_value:  sqlstate[value] sqlstate_value  |condition_name  |sqlwarning  |not found  |sqlexception  |mysql_error_code

    這個語句指定每個可以處理一個或多個條件的處理程序。如果產生一個或多個條件,指定的語句被執行。對一個continue處理程序,當前子程序的執行處理程序語句之后繼續。對于exit處理程序,當前begin…end復合語句的執行被終止。undo處理程序類型語句還不被支持。
1. sqlwarning是對所有以01開頭的sqlstate代碼的速記。
2. not found是對所有以02開頭的sqlstate代碼的速記。
3. sqlexception 是對所有沒有被sqlwarning或not found捕獲的sqlstate代碼的速記。 

3.3 使用游標:
    mysql的查詢語句可以返回多條記錄結果,那么在表達式中如何遍歷這些記錄結果呢?mysql提供了游標來實現。通過指定由select語句返回的行集合(包括滿足該語句的where子句所列條件的所有行),由該語句返回完整的行集合叫結果集。應用程序需要一種機制來一次處理結果集中的一行或連續的幾行,而游標通過每次指定一條記錄完成與應用程序的交互。
    游標可以看做一種數據類型,可以用來遍歷結果集,相當是指針或數組的下標。處理結果集的方法可以通過游標定位到結果集的某一行,從當前結果集的位置搜索一行或者一部分行或者結果集中的當前行進行數據修改。

    3.3.1 聲明游標:

語法形式如下:
declare cursor_name cursor for select_statement;

    上述語句中,cursor_name參數表示有游標的名稱,參數select_statement表示select語句。因為游標需要遍歷結果集中的每一行,增加了服務器的負擔,導致游標的效率并不高。如果游標操作的數據超過1萬行,那么應該采用其他方式,另外如果使用了游標,還應盡量避免在游標循環中進行表連接操作。 

    3.3.2 打開游標:

語法形式為:
open cursor_name

//注意,打開一個游標時,游標并不指向第一條記錄,而是指向第一條記錄的前邊。

    3.3.3 使用游標:

語法形式如下:
fetch cursor_name into var_name [,var_name] ...

    3.3.4 關閉游標:

語法形式如下:
close cursor_name

4. 修改存儲過程和函數 
    對于已經創建好的存儲過程和函數,當使用一段時間后,就會需要進行一些定義上的修改??梢酝ㄟ^alter procedure語句實現修改存儲過程,通過alter function語句實現修改函數。
  4.1 修改存儲過程:

語法形式如下:

alter procedure procedure_name  [characteristic...]

    procedure_name參數表示所要修改存儲過程的名字,而characteristic參數指定修改后存儲過程的特性,與定義存儲過程的該參數相比,取值只能是如下值:

|(contains sql|no sql|reads sql data|modifys sql data) |sql security {definer|invoker} |comment ‘string' ) 

  4.2 修改函數:

語法形式如下:

alter function function_name  [characteristic...]

    function_name參數表示所要修改函數的名字,而characteristic參數指定修改后的函數特性,與定義函數的該參數相比,取值只能是如下值:
|(contains sql|no sql|reads sql data|modifys sql data)
|sql security {definer|invoker}
|comment ‘string'

5. 刪除存儲過程和函數 
  5.1 通過drop語句刪除存儲過程:

語法形式如下:
drop prcedure proce_name;

  5.2 通過drop function語句刪除函數:

語法形式如下:
drop function func_name;

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


注:相關教程知識閱讀請移步到MYSQL教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩av在线播放资源| 亚洲va欧美va国产综合剧情| 日韩国产在线播放| 91久久精品视频| 色青青草原桃花久久综合| 国产视频欧美视频| 日韩中文第一页| 国产精品免费一区| 国产日韩在线一区| 成人久久精品视频| 国产午夜精品久久久| 欧美夫妻性视频| 亚洲伦理中文字幕| 91亚洲国产成人精品性色| 亚洲精品成人免费| 久久精品国产精品亚洲| 欧美午夜丰满在线18影院| 日韩电影免费观看中文字幕| 久久久久免费视频| 欧美激情精品久久久久久免费印度| 国内免费久久久久久久久久久| 欧美成人三级视频网站| 日韩欧美在线看| 国产91精品在线播放| 亚洲天堂一区二区三区| 国内精品在线一区| 欧美成人精品一区| 亚洲日韩欧美视频| 欧美在线性爱视频| 国产精品成人观看视频国产奇米| 中文字幕在线看视频国产欧美在线看完整| 伊人成人开心激情综合网| 国产精品男人爽免费视频1| 日韩中文字幕视频在线| 中文字幕一区日韩电影| 国产精品久在线观看| 国产日韩av在线播放| 丝袜一区二区三区| 精品日本美女福利在线观看| 欧美精品www| 中文国产成人精品久久一| 国产欧美日韩91| 欧美成aaa人片在线观看蜜臀| 国产日韩一区在线| 亚洲成年人在线播放| 91精品国产乱码久久久久久蜜臀| 最近2019年好看中文字幕视频| 亚洲丝袜av一区| 欧美精品在线免费观看| 一区二区三区日韩在线| 国产日韩换脸av一区在线观看| 中文字幕日韩欧美在线| 日韩av日韩在线观看| 成人国产在线激情| 日韩专区在线观看| 欧美高清第一页| 亚洲女人初尝黑人巨大| 欧美日韩中文字幕综合视频| 91国产精品91| 日韩精品一区二区三区第95| 亚洲qvod图片区电影| 成人黄色影片在线| 久久久人成影片一区二区三区观看| 欧洲s码亚洲m码精品一区| 精品亚洲男同gayvideo网站| 最好看的2019的中文字幕视频| 国产精品爱啪在线线免费观看| 伊人久久精品视频| 久久精品成人欧美大片古装| 成人久久久久久久| 精品视频在线播放色网色视频| 国产精品99导航| 精品国偷自产在线| 国内成人精品视频| 成人激情视频在线播放| **欧美日韩vr在线| 在线播放国产一区中文字幕剧情欧美| 日韩亚洲欧美中文高清在线| 九色成人免费视频| 久久久久久国产精品三级玉女聊斋| 欧美日韩国产一区在线| 91av在线精品| 欧美巨猛xxxx猛交黑人97人| 欧美韩国理论所午夜片917电影| 欧美日韩一区二区免费在线观看| 日韩欧美精品网站| 成人a免费视频| 亚洲人成免费电影| 国产亚洲精品美女久久久| 日本成人黄色片| 国产一区二区视频在线观看| 九九热在线精品视频| 欧美激情免费在线| 国产精品成av人在线视午夜片| 高清在线视频日韩欧美| 日韩精品在线观看网站| 久久久中精品2020中文| 在线日韩日本国产亚洲| 日韩欧美一区二区在线| 日韩女在线观看| 国产精品主播视频| 久久久久久久网站| 亚洲人成电影网站色…| 精品女同一区二区三区在线播放| 国产在线拍揄自揄视频不卡99| 亚洲日本aⅴ片在线观看香蕉| 色www亚洲国产张柏芝| 国产乱肥老妇国产一区二| 欧美巨大黑人极品精男| 欧美精品制服第一页| 日韩av电影手机在线观看| 国产成人在线一区二区| 日本人成精品视频在线| 国产中文字幕日韩| 91日韩在线视频| 日韩国产高清视频在线| 国产精品h片在线播放| 日韩亚洲精品视频| 亚洲精品综合精品自拍| 亚洲国产精品va在线| 高潮白浆女日韩av免费看| 成人做爰www免费看视频网站| 亚洲午夜精品久久久久久性色| 欧美精品18videos性欧| 精品久久久久国产| 一色桃子一区二区| 日韩一区视频在线| 亚洲欧洲成视频免费观看| 久久久久久网站| 2019国产精品自在线拍国产不卡| 少妇激情综合网| 精品国产一区二区三区久久狼5月| 成人精品一区二区三区| 日韩欧美极品在线观看| 亚洲第一黄色网| 亚洲精品中文字幕女同| 午夜欧美不卡精品aaaaa| 亚洲free性xxxx护士hd| 91在线精品视频| 福利精品视频在线| 亚洲xxx视频| 88国产精品欧美一区二区三区| 欧美性猛交丰臀xxxxx网站| 18性欧美xxxⅹ性满足| 亚洲欧美精品伊人久久| 国产欧美一区二区三区在线| 精品亚洲精品福利线在观看| 日韩av一区二区在线观看| 国产ts人妖一区二区三区| 亚洲桃花岛网站| 欧美性生活大片免费观看网址| 亚洲国产欧美一区| 92国产精品久久久久首页| 国产精品影片在线观看| 欧美在线亚洲一区| 国产精品视频男人的天堂| 欧美性videos高清精品| 日韩中文字幕av| 成人性生交大片免费观看嘿嘿视频| 亚洲电影免费观看高清完整版在线观看| 亚洲美女av黄| 一区二区三区视频在线| 欧美国产日产韩国视频| 日本韩国在线不卡|