存儲(chǔ)過程

存儲(chǔ)過程簡(jiǎn)介


存儲(chǔ)過程(Stored Procedure)是數(shù)據(jù)庫(kù)系統(tǒng)中,一組為了完成特定功能的SQL 語(yǔ)句集粥鞋,經(jīng)編譯后存儲(chǔ)在數(shù)據(jù)庫(kù)中,用戶通過指定存儲(chǔ)過程的名字并給出參數(shù)(如果該存儲(chǔ)過程帶有參數(shù))來執(zhí)行它瞄崇。在數(shù)據(jù)庫(kù)系統(tǒng)中呻粹,存儲(chǔ)過程和觸發(fā)器具有很重要的作用壕曼。無論是存儲(chǔ)過程還是觸發(fā)器,都是SQL 語(yǔ)句和流程控制語(yǔ)句的集合等浊。

存儲(chǔ)過程分類

1系統(tǒng)存儲(chǔ)過程
  以sp_開頭,用來進(jìn)行系統(tǒng)的各項(xiàng)設(shè)定.取得信息.相關(guān)管理工作腮郊。
2本地存儲(chǔ)過程
  用戶創(chuàng)建的存儲(chǔ)過程是由用戶創(chuàng)建并完成某一特定功能的存儲(chǔ)過程,這跟各種編程語(yǔ)言里用戶自己寫的函數(shù)非常類似筹燕。我們一般所說的存儲(chǔ)過程就是指本地存儲(chǔ)過程轧飞。今天我們重點(diǎn)介紹本地存儲(chǔ)過程,其他存儲(chǔ)過程了解即可撒踪。
3臨時(shí)存儲(chǔ)過程
分為兩種存儲(chǔ)過程:一是本地臨時(shí)存儲(chǔ)過程过咬,以“#”開頭,這樣的存儲(chǔ)過程就是存放在tempdb數(shù)據(jù)庫(kù)中的本地臨時(shí)存儲(chǔ)過程制妄,且只有創(chuàng)建它的用戶才能執(zhí)行它;  二是全局臨時(shí)存儲(chǔ)過程掸绞,以“##”開頭,這樣的存儲(chǔ)過程就是存儲(chǔ)在tempdb數(shù)據(jù)庫(kù)中的全局臨時(shí)存儲(chǔ)過程耕捞,全局臨時(shí)存儲(chǔ)過程一旦創(chuàng)建衔掸,以后連接到服務(wù)器的任意用戶都可以執(zhí)行它,而且不需要特定的權(quán)限俺抽。
4遠(yuǎn)程存儲(chǔ)過程
  在SQL Server2005中敞映,遠(yuǎn)程存儲(chǔ)過程(Remote Stored Procedures)是位于遠(yuǎn)程服務(wù)器上的存儲(chǔ)過程,通沉赘可以使用分布式查詢和EXECUTE命令執(zhí)行一個(gè)遠(yuǎn)程存儲(chǔ)過程振愿。
5擴(kuò)展存儲(chǔ)過程
  擴(kuò)展存儲(chǔ)過程(Extended Stored Procedures)是用戶可以使用外部程序語(yǔ)言編寫的存儲(chǔ)過程,而且擴(kuò)展存儲(chǔ)過程的名稱通常以xp_開頭弛饭。

創(chuàng)建存儲(chǔ)過程的基本代碼結(jié)構(gòu):

 create procedure Procedure_Name //Procedure_Name為存儲(chǔ)過程(不能以阿拉伯?dāng)?shù)字開頭)冕末,在一個(gè)數(shù)據(jù)庫(kù)中觸發(fā)器名是唯一的。
 @Param1 int ,@Param2 int//@Param1和  @Param2為存儲(chǔ)過程的參數(shù)孩哑,DataType為參數(shù)類型栓霜,多個(gè)參數(shù)采用“,”隔開

AS//存儲(chǔ)過程要執(zhí)行的操作

BEGIN
     --begin跟end組成,可以不寫横蜒,如果執(zhí)行sql語(yǔ)句較為麻煩胳蛮,則使用BEGIN END會(huì)使得代碼更加整齊,容易理解
END
GO //操作完成
exec Procedure_Name[采納數(shù)名] //調(diào)用存儲(chǔ)過程

存儲(chǔ)過程優(yōu)缺點(diǎn)總結(jié):

優(yōu)點(diǎn)
  1.存儲(chǔ)過程只在創(chuàng)造時(shí)進(jìn)行編譯丛晌,以后每次執(zhí)行存儲(chǔ)過程都不需再重新編譯仅炊,而一般SQL語(yǔ)句每執(zhí)行一次就編譯一次,所以使用存儲(chǔ)過程可提高數(shù)據(jù)庫(kù)執(zhí)行速度。
  2.當(dāng)對(duì)數(shù)據(jù)庫(kù)進(jìn)行復(fù)雜操作時(shí)(如對(duì)多個(gè)表進(jìn)行Update,Insert,Query,Delete時(shí))澎蛛,可將此復(fù)雜操作用存儲(chǔ)過程封裝起來與數(shù)據(jù)庫(kù)提供的事務(wù)處理結(jié)合一起使用抚垄。
  3.存儲(chǔ)過程可以重復(fù)使用,可減少數(shù)據(jù)庫(kù)開發(fā)人員的工作量(復(fù)用性高,面向?qū)ο蟮木幊趟枷?
  4.安全性高,可設(shè)定只有某些用戶才具有對(duì)指定存儲(chǔ)過程的使用權(quán)
缺點(diǎn)
  1.調(diào)試麻煩,但是用 PL/SQL Developer 調(diào)試很方便呆馁!彌補(bǔ)這個(gè)缺點(diǎn)桐经。
  2.移植問題,數(shù)據(jù)庫(kù)端代碼當(dāng)然是與數(shù)據(jù)庫(kù)相關(guān)的浙滤。但是如果是做工程型項(xiàng)目阴挣,基本不存在移植問題。
  3.重新編譯問題纺腊,因?yàn)楹蠖舜a是運(yùn)行前編譯的畔咧,如果帶有引用關(guān)系的對(duì)象發(fā)生改變時(shí),受影響的存儲(chǔ)過程揖膜、包將需要重新編譯(不過也可以設(shè)置成運(yùn)行時(shí)刻自動(dòng)編譯)誓沸。
  4.如果在一個(gè)程序系統(tǒng)中大量的使用存儲(chǔ)過程,到程序交付使用的時(shí)候隨著用戶需求的增加會(huì)導(dǎo)致數(shù)據(jù)結(jié)構(gòu)的變化壹粟,接著就是系統(tǒng)的相關(guān)問題了拜隧,最后如果用戶想維護(hù)該系統(tǒng)可以說是很難很難、而且代價(jià)是空前的煮寡,維護(hù)起來更麻煩虹蓄。

簡(jiǎn)單秒殺存儲(chǔ)過程

DELIMITER $$ --console; 轉(zhuǎn)化為$$
--定義存儲(chǔ)過程
--參數(shù):in 輸入?yún)?shù);out 輸出參數(shù)
--row_count();返回上一條修改類型sql(delete犀呼、insert幸撕、update)的影響行數(shù)
--row_count:0 未修改數(shù)據(jù) >0 表示修改的行數(shù);<0:sql錯(cuò)誤/未執(zhí)行系應(yīng)該sql
CREATE PROCEDURE `seckill`.`excute_seckill`
(in v_seckill_id bigint,in v_phone VARCHAR,in v_kill_time TIMESTAMP,out r_result int)
  BEGIN
    DECLARE insert_count int default 0;
    START TRANSACTION;
    insert ignore into success_killed
       (seckill_id,user_phone,create_time)
       values (v_seckill_id,v_phone,v_kill_time)
    select row_count() into insert_count;
    IF (insert_count<0) THEN
       ROLLBACK ;
       set r_result = -1;
    ELSEIF(insert_count<0) THEN
       ROLLBACK ;
       SET r_result = -2;
    ELSE
       update seckil set number = number-1
       where seckill_id = v_seckill_id
         and end_time > v_kill_time
         and start_time < v_kill_time
         and number > 0;
       select row_count() into insert_count;
       IF(insert_count==0) THEN
          ROLLBACK ;
          SET r_result = 0;
       ELSEIF(insert_count < 0) THEN
          ROLLBACK ;
          SET r_result = -2;
       ELSE
          COMMIT;
          SET r_result = 0;
       END IF;
    END IF;
  END;
$$
--存儲(chǔ)過程定義結(jié)束
DELIMITER ;
set @r_result = -3;
--調(diào)用執(zhí)行存儲(chǔ)過程
call execute_seckill(1003,15400899706,now(),@r_result);

--獲取結(jié)果
select @r_result;
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市外臂,隨后出現(xiàn)的幾起案子坐儿,更是在濱河造成了極大的恐慌,老刑警劉巖宋光,帶你破解...
    沈念sama閱讀 211,743評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件貌矿,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡罪佳,警方通過查閱死者的電腦和手機(jī)逛漫,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來赘艳,“玉大人酌毡,你說我怎么就攤上這事±俟埽” “怎么了枷踏?”我有些...
    開封第一講書人閱讀 157,285評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)掰曾。 經(jīng)常有香客問我旭蠕,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,485評(píng)論 1 283
  • 正文 為了忘掉前任掏熬,我火速辦了婚禮佑稠,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘旗芬。我一直安慰自己讶坯,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,581評(píng)論 6 386
  • 文/花漫 我一把揭開白布岗屏。 她就那樣靜靜地躺著辆琅,像睡著了一般。 火紅的嫁衣襯著肌膚如雪这刷。 梳的紋絲不亂的頭發(fā)上婉烟,一...
    開封第一講書人閱讀 49,821評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音暇屋,去河邊找鬼似袁。 笑死,一個(gè)胖子當(dāng)著我的面吹牛咐刨,可吹牛的內(nèi)容都是我干的昙衅。 我是一名探鬼主播,決...
    沈念sama閱讀 38,960評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼定鸟,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼而涉!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起联予,我...
    開封第一講書人閱讀 37,719評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤啼县,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后沸久,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體季眷,經(jīng)...
    沈念sama閱讀 44,186評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,516評(píng)論 2 327
  • 正文 我和宋清朗相戀三年卷胯,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了子刮。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,650評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡窑睁,死狀恐怖挺峡,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情卵慰,我是刑警寧澤沙郭,帶...
    沈念sama閱讀 34,329評(píng)論 4 330
  • 正文 年R本政府宣布,位于F島的核電站裳朋,受9級(jí)特大地震影響病线,放射性物質(zhì)發(fā)生泄漏吓著。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,936評(píng)論 3 313
  • 文/蒙蒙 一送挑、第九天 我趴在偏房一處隱蔽的房頂上張望绑莺。 院中可真熱鬧,春花似錦惕耕、人聲如沸纺裁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)欺缘。三九已至,卻和暖如春挤安,著一層夾襖步出監(jiān)牢的瞬間谚殊,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評(píng)論 1 266
  • 我被黑心中介騙來泰國(guó)打工蛤铜, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留嫩絮,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,370評(píng)論 2 360
  • 正文 我出身青樓围肥,卻偏偏與公主長(zhǎng)得像剿干,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子穆刻,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,527評(píng)論 2 349

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