MySQL編程:存儲過程、存儲函數、觸發器

語句塊模式

在mysql編程中,begin...end;基本代替了原來編程語句中的{...}語法。但又有所區別:一個begin...end;塊可以使用leave語句來“退出”該語句塊。

流程控制

  • if語句
  • case語句:類似于php中的swich case
  • loop語句:循環語句
  • while語句:循環語句
  • repeat語句:循環語句
  • leave語句:類似于break

MySQL中的變量

變量有使用場景限制:在執行create、insert、delete、update、select等語句的環境(命令環境)下,不能使用流程控制語句。只能在存儲函數、存儲過程、觸發器(變成環境)環境下使用。

//變量聲明語法
declare 變量名 變量類型 [default 初始值]
//變量賦值語法
set 變量名 = 變量值

注意:
MySQL有另外幾種種變量形式叫做“會話變量”,會話變量的形式為:@變量名;會話變量無需單獨聲明,而是直接賦值,除此之外,既它可以在編程環境下使用,也可在命令環境下使用

//會話變量的形式為:@變量名;
@變量名;
//會話變量賦值
set 變量名 = 值;

set 變量名 = 表達式;//使用語法1:必須先使用declare聲明,需要編程環境

set @變量名 = 表達式//使用語法2:無需使用declare,而是直接賦值,類似php定義變量并賦值,無需編程環境

select @變量名 := 表達式;//使用語法3:此語句會給變量賦值,同時還會作為一個select語句返回"結果集"

select 表達式 into @變量名;//不輸出"結果集",只給變量賦值

存儲函數

定義形式:
#參數類型和返回類型可以使mysql中的各種數據類型,例如:varchar
#必須有return語句,返回類型要跟設定類型一致
creat function 函數名(形參1 類型1,形參2 類型2,...)
returns 返回類型
begin
    #這里寫完整的函數語句
    return xx;
end

舉例:

Snip20170304_1.png

調用形式:

跟系統函數調用形式一樣,例如:

select 3,now(),f1();//f1為自定義的存儲函數

舉例:

Snip20170304_2.png

存儲過程

存儲過程是沒有返回值的“函數”,雖然如此,但可以“返回”結果集。

定義形式

create procedure 存儲過程名([in|out|inout]形參1 類型1,[in|out|inout]形參2 類型2,...)
begin
    #這里寫完整的過程語句
    #其中查詢語句(select)會作為存儲過程調用的結果,返回結果集 
end

舉例:

Snip20170304_3.png

特別注意:

in,out,inout用于修飾一個形參的"數據流向"

  1. in:默認值,只作為外部輸入數據,調用環境傳入存儲過程內部
  2. out:只作為輸出數據,即存儲過程傳出到調用環境
  3. inout:雙向傳輸
    舉例:


    Snip20170304_8.png

調用形式

call 存儲過程名(參數);

舉例:


Snip20170304_4.png
Snip20170304_6.png

觸發器

在對數據表操作之前或之后執行預先定義好的一段代碼。類似于iOS中頁面生命周期的那幾個方法。

定義形式

creat trigger 觸發器名 before(或after) insert(update 或 delete) on 表名 as begin
    要執行的代碼
end;

舉例:


Snip20170304_10.png

注意:在觸發器內部,兩個關鍵字。new:代表新插入的一條數據,在insert時有效。old:代表舊的一條數據,在update或delete的時候有效。

對表操作時自動調用

Snip20170304_11.png

總結

  1. 存儲函數:需要返回數據,作為數據使用
  2. 存儲過程:不能有返回值,可設定數據的進出方向(in,out,inout),使用call語句調用
  3. 觸發器:不能返回數據,也不能有select語句,在特定情況下自動調用
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,825評論 6 546
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,814評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 178,980評論 0 384
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 64,064評論 1 319
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,779評論 6 414
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 56,109評論 1 330
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,099評論 3 450
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,287評論 0 291
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,799評論 1 338
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,515評論 3 361
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,750評論 1 375
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,221評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,933評論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,327評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,667評論 1 296
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,492評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,703評論 2 380

推薦閱讀更多精彩內容

  • 當一個大型系統在建立時,會發現,很多的SQL操作是有重疊的,個別計算是相同的,比如:業務系統中,計算一張工單的計算...
    JackFrost_fuzhu閱讀 3,402評論 0 27
  • 1.1 基本結構 PL/SQL程序由三個塊組成,即聲明部分、執行部分、異常處理部分。 1.2 命名規則 1.3 記...
    慢清塵閱讀 3,878評論 3 14
  • 任務需求:定時執行的任務,調用存儲過程,進行數據遷移。 存儲過程相關總結:(存儲過程的創建 不能伴隨有if exi...
    時待吾閱讀 3,107評論 0 4
  • 1. Java基礎部分 基礎部分的順序:基本語法,類相關的語法,內部類的語法,繼承相關的語法,異常的語法,線程的語...
    子非魚_t_閱讀 31,738評論 18 399
  • 我說我想你了 世界就開始下起了雨 滴滴飄落 冰涼縷縷思緒 我說我想你了 大樹便開始枯萎了黃葉 片片飛舞 荒蕪種種往...
    美西xyy閱讀 274評論 4 7