mysql存儲過程

1.存儲過程是存儲在數(shù)據(jù)庫目錄中的一段聲明性SQL語句殿较。觸發(fā)器泽裳,其他存儲過程以及JavaPython增拥,PHP等應(yīng)用程序可以調(diào)用存儲過程啄巧。

2.MySQL存儲過程的優(yōu)點

通常存儲過程有助于提高應(yīng)用程序的性能。當創(chuàng)建掌栅,存儲過程被編譯之后秩仆,就存儲在數(shù)據(jù)庫中。 但是猾封,MySQL實現(xiàn)的存儲過程略有不同澄耍。 MySQL存儲過程按需編譯。 在編譯存儲過程之后晌缘,MySQL將其放入緩存中齐莲。 MySQL為每個連接維護自己的存儲過程高速緩存。 如果應(yīng)用程序在單個連接中多次使用存儲過程磷箕,則使用編譯版本选酗,否則存儲過程的工作方式類似于查詢。

存儲過程有助于減少應(yīng)用程序和數(shù)據(jù)庫服務(wù)器之間的流量岳枷,因為應(yīng)用程序不必發(fā)送多個冗長的SQL語句芒填,而只能發(fā)送存儲過程的名稱和參數(shù)呜叫。

存儲的程序?qū)θ魏螒?yīng)用程序都是可重用的和透明的。 存儲過程將數(shù)據(jù)庫接口暴露給所有應(yīng)用程序殿衰,以便開發(fā)人員不必開發(fā)存儲過程中已支持的功能朱庆。

存儲的程序是安全的。 數(shù)據(jù)庫管理員可以向訪問數(shù)據(jù)庫中存儲過程的應(yīng)用程序授予適當?shù)臋?quán)限闷祥,而不向基礎(chǔ)數(shù)據(jù)庫表提供任何權(quán)限娱颊。

3.MySQL存儲過程的缺點

如果使用大量存儲過程,那么使用這些存儲過程的每個連接的內(nèi)存使用量將會大大增加蜀踏。 此外维蒙,如果您在存儲過程中過度使用大量邏輯操作,則CPU使用率也會增加果覆,因為數(shù)據(jù)庫服務(wù)器的設(shè)計不當于邏輯運算颅痊。

存儲過程的構(gòu)造使得開發(fā)具有復(fù)雜業(yè)務(wù)邏輯的存儲過程變得更加困難。

很難調(diào)試存儲過程局待。只有少數(shù)數(shù)據(jù)庫管理系統(tǒng)允許您調(diào)試存儲過程斑响。不幸的是,MySQL不提供調(diào)試存儲過程的功能钳榨。

開發(fā)和維護存儲過程并不容易舰罚。開發(fā)和維護存儲過程通常需要一個不是所有應(yīng)用程序開發(fā)人員擁有的專業(yè)技能。這可能會導(dǎo)致應(yīng)用程序開發(fā)和維護階段的問題薛耻。

4.編寫一個存儲過程:

DELIMITER//

CREATE PROCEDURE GetAllProducts()

BEGIN

SELECT * FROM products;

END//

DELIMITER;

SQL

讓我們來詳細地說明上述存儲過程:

第一個命令是DELIMITER //营罢,它與存儲過程語法無關(guān)。DELIMITER語句將標準分隔符 - 分號(;)更改為://饼齿。 在這種情況下饲漾,分隔符從分號(;)更改為雙斜杠//。為什么我們必須更改分隔符缕溉? 因為我們想將存儲過程作為整體傳遞給服務(wù)器考传,而不是讓mysql工具一次解釋每個語句。 在END關(guān)鍵字之后证鸥,使用分隔符//來指示存儲過程的結(jié)束僚楞。 最后一個命令(DELIMITER;)將分隔符更改回分號(;)。

使用CREATE PROCEDURE語句創(chuàng)建一個新的存儲過程枉层。在CREATE PROCEDURE語句之后指定存儲過程的名稱泉褐。在這個示例中,存儲過程的名稱為:GetAllProducts鸟蜡,并把括號放在存儲過程的名字之后膜赃。

BEGIN和END之間的部分稱為存儲過程的主體。將聲明性SQL語句放在主體中以處理業(yè)務(wù)邏輯矩欠。 在這個存儲過程中财剖,我們使用一個簡單的SELECT語句來查詢products表中的數(shù)據(jù)。

CALL GetAllProducts(); 調(diào)用存儲過程

5.聲明變量

聲明變量

要在存儲過程中聲明一個變量癌淮,可以使用DECLARE語句躺坟,如下所示:

DECLARE variable_name? datatype(size) DEFAULTdefault_value;

SQL

下面來更詳細地解釋上面的語句:

首先,在DECLARE關(guān)鍵字后面要指定變量名乳蓄。變量名必須遵循MySQL表列名稱的命名規(guī)則咪橙。

其次,指定變量的數(shù)據(jù)類型及其大小虚倒。變量可以有任何MySQL數(shù)據(jù)類型美侦,如INT,VARCHAR魂奥,DATETIME等菠剩。

第三,當聲明一個變量時耻煤,它的初始值為NULL具壮。但是可以使用DEFAULT關(guān)鍵字為變量分配默認值。

分配變量值

當聲明了一個變量后哈蝇,就可以開始使用它了棺妓。要為變量分配一個值,可以使用SET語句炮赦,例如:

DECLARE total_count INTDEFAULT 0;

SET total_count=10;

SQL

上面語句中怜跑,分配total_count變量的值為10。

變量范圍(作用域)

一個變量有自己的范圍(作用域)吠勘,它用來定義它的生命周期性芬。 如果在存儲過程中聲明一個變量,那么當達到存儲過程的END語句時看幼,它將超出范圍批旺,因此在其它代碼塊中無法訪問。

如果您在BEGIN END塊內(nèi)聲明一個變量诵姜,那么如果達到END汽煮,它將超出范圍。 可以在不同的作用域中聲明具有相同名稱的兩個或多個變量棚唆,因為變量僅在自己的作用域中有效暇赤。 但是,在不同范圍內(nèi)聲明具有相同名稱的變量不是很好的編程習慣宵凌。

以@符號開頭的變量是會話變量鞋囊。直到會話結(jié)束前它可用和可訪問。

6.存儲過程參數(shù)

MySQL存儲過程參數(shù)簡介

在現(xiàn)實應(yīng)用中瞎惫,開發(fā)的存儲過程幾乎都需要參數(shù)溜腐。這些參數(shù)使存儲過程更加靈活和有用译株。 在MySQL中,參數(shù)有三種模式:IN挺益,OUT或INOUT歉糜。

IN- 是默認模式。在存儲過程中定義IN參數(shù)時望众,調(diào)用程序必須將參數(shù)傳遞給存儲過程匪补。 另外,IN參數(shù)的值被保護烂翰。這意味著即使在存儲過程中更改了IN參數(shù)的值夯缺,在存儲過程結(jié)束后仍保留其原始值。換句話說甘耿,存儲過程只使用IN參數(shù)的副本踊兜。

OUT- 可以在存儲過程中更改OUT參數(shù)的值,并將其更改后新值傳遞回調(diào)用程序棵里。請注意润文,存儲過程在啟動時無法訪問OUT參數(shù)的初始值。

INOUT-INOUT參數(shù)是IN和OUT參數(shù)的組合殿怜。這意味著調(diào)用程序可以傳遞參數(shù)典蝌,并且存儲過程可以修改INOUT參數(shù)并將新值傳遞回調(diào)用程序。

在存儲過程中定義參數(shù)的語法如下:

MODE param_name param_type(param_size)

SQL

上面語法說明如下 -

根據(jù)存儲過程中參數(shù)的目的头谜,MODE可以是IN骏掀,OUT或INOUT。

param_name是參數(shù)的名稱柱告。參數(shù)的名稱必須遵循MySQL中列名的命名規(guī)則截驮。

在參數(shù)名之后是它的數(shù)據(jù)類型和大小。和變量一樣际度,參數(shù)的數(shù)據(jù)類型可以是任何有效的MySQL數(shù)據(jù)類型葵袭。

如果存儲過程有多個參數(shù),則每個參數(shù)由逗號(,)分隔乖菱。

7.IF語句使用:


8.case語句:



8存儲函數(shù):

存儲的函數(shù)是返回單個值的特殊類型的存儲程序坡锡。您使用存儲的函數(shù)來封裝在SQL語句或存儲的程序中可重用的常用公式或業(yè)務(wù)規(guī)則。

存儲過程不同窒所,您可以在SQL語句中使用存儲的函數(shù)鹉勒,也可以在表達式中使用。 這有助于提高程序代碼的可讀性和可維護性吵取。

MySQL存儲函數(shù)語法

以下說明了創(chuàng)建新存儲函數(shù)的最簡單語法:

CREATE FUNCTION function_name(param1,param2…)

RETURNS datatype

[NOT] DETERMINISTIC

statements

SQL

首先禽额,在CREATE FUNCTION子句之后指定存儲函數(shù)的名稱。

其次皮官,列出括號內(nèi)存儲函數(shù)的所有參數(shù)脯倒。 默認情況下实辑,所有參數(shù)均為IN參數(shù)。不能為參數(shù)指定IN徙菠,OUT或INOUT修飾符。

第三郁岩,必須在RETURNS語句中指定返回值的數(shù)據(jù)類型。它可以是任何有效的MySQL數(shù)據(jù)類型缺狠。

第四问慎,對于相同的輸入?yún)?shù),如果存儲的函數(shù)返回相同的結(jié)果挤茄,這樣則被認為是確定性的如叼,否則存儲的函數(shù)不是確定性的。必須決定一個存儲函數(shù)是否是確定性的穷劈。 如果您聲明不正確笼恰,則存儲的函數(shù)可能會產(chǎn)生意想不到的結(jié)果,或者不使用可用的優(yōu)化歇终,從而降低性能社证。

第五,將代碼寫入存儲函數(shù)的主體中评凝。 它可以是單個語句或復(fù)合語句追葡。 在主體部分中,必須至少指定一個RETURN語句奕短。RETURN語句用于返回一個值給調(diào)用者宜肉。 每當?shù)竭_RETURN語句時,存儲的函數(shù)的執(zhí)行將立即終止翎碑。



?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末谬返,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子日杈,更是在濱河造成了極大的恐慌遣铝,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,104評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件达椰,死亡現(xiàn)場離奇詭異翰蠢,居然都是意外死亡,警方通過查閱死者的電腦和手機啰劲,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評論 3 399
  • 文/潘曉璐 我一進店門梁沧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人蝇裤,你說我怎么就攤上這事廷支∑导” “怎么了?”我有些...
    開封第一講書人閱讀 168,697評論 0 360
  • 文/不壞的土叔 我叫張陵恋拍,是天一觀的道長垛孔。 經(jīng)常有香客問我,道長施敢,這世上最難降的妖魔是什么周荐? 我笑而不...
    開封第一講書人閱讀 59,836評論 1 298
  • 正文 為了忘掉前任,我火速辦了婚禮僵娃,結(jié)果婚禮上概作,老公的妹妹穿的比我還像新娘。我一直安慰自己默怨,他們只是感情好讯榕,可當我...
    茶點故事閱讀 68,851評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著匙睹,像睡著了一般愚屁。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上痕檬,一...
    開封第一講書人閱讀 52,441評論 1 310
  • 那天霎槐,我揣著相機與錄音,去河邊找鬼梦谜。 笑死栽燕,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的改淑。 我是一名探鬼主播碍岔,決...
    沈念sama閱讀 40,992評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼朵夏!你這毒婦竟也來了蔼啦?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,899評論 0 276
  • 序言:老撾萬榮一對情侶失蹤仰猖,失蹤者是張志新(化名)和其女友劉穎捏肢,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體饥侵,經(jīng)...
    沈念sama閱讀 46,457評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡鸵赫,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,529評論 3 341
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了躏升。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片辩棒。...
    茶點故事閱讀 40,664評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出一睁,到底是詐尸還是另有隱情钻弄,我是刑警寧澤,帶...
    沈念sama閱讀 36,346評論 5 350
  • 正文 年R本政府宣布者吁,位于F島的核電站窘俺,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏复凳。R本人自食惡果不足惜瘤泪,卻給世界環(huán)境...
    茶點故事閱讀 42,025評論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望育八。 院中可真熱鬧均芽,春花似錦、人聲如沸单鹿。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽仲锄。三九已至,卻和暖如春湃鹊,著一層夾襖步出監(jiān)牢的瞬間儒喊,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評論 1 272
  • 我被黑心中介騙來泰國打工币呵, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留怀愧,地道東北人。 一個月前我還...
    沈念sama閱讀 49,081評論 3 377
  • 正文 我出身青樓余赢,卻偏偏與公主長得像芯义,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子妻柒,可洞房花燭夜當晚...
    茶點故事閱讀 45,675評論 2 359

推薦閱讀更多精彩內(nèi)容

  • 任務(wù)需求:定時執(zhí)行的任務(wù)扛拨,調(diào)用存儲過程,進行數(shù)據(jù)遷移举塔。 存儲過程相關(guān)總結(jié):(存儲過程的創(chuàng)建 不能伴隨有if exi...
    時待吾閱讀 3,089評論 0 4
  • 原文鏈接 MySQL存儲過程詳解 1.存儲過程簡介 我們常用的操作數(shù)據(jù)庫語言SQL語句在執(zhí)行的時候需要要先編譯绑警,然...
    亞斯咪妮閱讀 2,674評論 1 30
  • 1.1 創(chuàng)建存儲過程 MySQL中,創(chuàng)建存儲過程的基本形式如下: CREATEPROCEDUREsp_name([...
    95年的哈密瓜閱讀 446評論 0 4
  • 轉(zhuǎn)載自這里 存儲過程簡介 我們常用的操作數(shù)據(jù)庫語言SQL語句在執(zhí)行的時候需要要先編譯央渣,然后執(zhí)行计盒,而存儲過程(Sto...
    杜七閱讀 2,403評論 4 27
  • 創(chuàng)建存儲過程 MySQL中,創(chuàng)建存儲過程的基本形式如下: proc_parameter中的每個參數(shù)由3部分組成芽丹。這...
    FTOLsXD閱讀 488評論 0 1