SQL基礎理論篇(九):存儲過程

文章目錄

  • 簡介
  • 存儲過程的形式
    • 定義一個存儲過程
    • 使用delimiter定義語句結束符
    • 存儲過程中的三種參數類型
    • 流控制語句
  • 存儲過程的優缺點
  • 參考文獻

簡介

存儲過程Stored Procedure,SQL中的另一個重要應用。

前面說的視圖,只能勉強跟編程中的函數相似,存儲過程更進一步逼近了函數這一概念。 視圖仍然局限在SQL語句這個范疇,但是存儲過程已經可以進一步使用控制語句了。或許,存儲過程可以視為是視圖的更進一步

存儲過程是由SQL語句和流控制語句組成的語句集合,和函數一樣,它可以接收輸入參數,也可以把結果返回。一旦存儲過程被創建出來,使用它就像使用函數一樣簡單,直接調用存儲過程名就可以。

先簡單看了一下存儲過程究竟是什么,該怎么用,給我的感覺是:存儲過程就是遵循模塊化編程的指導思想下的一個比較簡陋的產品。

按教程的內容,本節將主要介紹以下部分:

  • 存儲過程的形式;
  • 存儲過程中各組成部分的介紹;
  • 存儲過程的優缺點。

存儲過程的形式

定義一個存儲過程

create procedure 存儲過程名稱([參數列表])
begin需要執行的語句
end

和視圖一樣,刪除存儲過程是drop procedure,更新存儲過程是alter procedure。

舉一個例子,寫一個簡單的存儲過程,計算1+2+3+…+n等于多少。

delimiter //
create procedure `add_num`(IN n INT)
begindeclare i int;declare sum int;set i=1;set sum=0;while i <= n doset sum = sum + i;set i = i+1;end while;select sum;
end //
delimiter ;

使用delimiter將’//‘作為整個存儲過程的結束符號,并在最后將結束符重新定義回默認的’;’

然后我們需要計算1到50的累加之和時,只需要調用call add_num(50);即可。

使用delimiter定義語句結束符

以MySQL舉例,如果使用Navicat這種圖形化工具來編寫存儲過程的話,是不需要手動定義delimiter的,navicat會自己加。

但是如果你使用的工具沒有提供這個功能,或者是你直接在后臺手敲的,那么你需要顯式用delimiter來定義結束符。

那么,為什么要定義語句結束符呢?

這是因為默認情況下MySQL使用分號,即;來作為結束符。

這樣的話,在存儲過程中的每一行SQL語句之后加分號,就相當于告訴SQL解釋器,這一行已經結束了,可以執行這一句了。

但是有時候我們不希望SQL這樣做,存儲過程是一個整體,我們更希望存儲過程整段一起執行,所以我們需要臨時定義新的delimiter,比如說’//'或者’$$‘。

存儲過程中的三種參數類型

分別是IN、OUT、和INOUT型。

在這里插入圖片描述

IN在存儲過程中不能返回,即存儲過程之外無法調用到in類型的參數,但是out和inout是可以調到的。

create procedure `func`(out max_hp float,out min_hp float,s varchar(255)
)
beginselect max(hp), min(hp)from heroswhere role_category=sinto max_hp, min_hp;
end

可以看到定義了兩個out類型的參數用來接收返回值,定義了一個參數s用來接收輸入,缺省情況下是IN參數

那怎么讀取到存儲過程返回的結果呢?

call func(@max_hp, @min_hp, '戰士');
select @max_hp, @min_hp;

就可以把結果打印出來了。

流控制語句

常用的流控制語句有:

  1. begin…end:表示存儲過程的范圍,有點像編程里的花括號;

  2. declare:聲明變量用,變量在使用前必須提前聲明,聲明方式declare var_name var_type;

  3. set: 賦值語句,用于變量賦值,如set var_name = value;

  4. select…into:把查詢結果存到out類變量中,就是利用select來為變量賦值;

  5. if…then…elseif…then…else…endif;

  6. case:

    casewhen 表達式1 then...when 表達式2 then...else...
    end
    
  7. LOOP、leave、iterate:LOOP是循環語句,類似for循環。leave中止本層循環,類似break。iterate中止本次循環,類似continue;

  8. repeat…until…end repeat:有點類似編程里的do while語句。repeat是先執行一次循環,然后until做表達式判斷,如果滿足條件就退出(這里跟while是不同的),即走end repeat;若條件不滿足,則繼續執行循環,直到滿足條件;

  9. while…do…end while:這個跟while沒有區別,滿足條件就循環,不滿足就退出;

存儲過程的優缺點

當前對存儲過程的使用一直都有爭議。有些公司對大型項目要求使用存儲過程,但有些公司卻明令禁止使用(如阿里)。

優點:

  1. 一次編譯多次使用。存儲過程只在創建時執行編譯,之后都不需要再進行編譯;
  2. 減少開發工作量。將代碼封裝成模塊,實際上是模塊化編程思想。這樣,多個模塊之間可以重復使用,而且也方便復雜查詢的拆解。
  3. 安全。可以設定哪些用戶可以使用存儲過程。
  4. 減少網絡傳輸量。連接一次數據庫,執行整個存儲過程即可,不需要多次連接數據庫,一行一行執行代碼。

缺點:

  1. 可移植性差。無法跨數據庫移植。
  2. 調試困難。多數DBMS不支持存儲過程的調試,所以對于復雜的存儲過程,其開發和維護都相當困難。
  3. 版本管理困難。存儲過程本身沒有版本控制,在迭代更新時會比較麻煩。另外,存儲過程很容易失效,比如說數據表索引發生變化時,可能會導致失效;
  4. 不適合高并發。對于分庫分表的并發查詢,很難維護。

參考文獻

  1. 13丨什么是存儲過程,在實際項目中用得多么?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/163522.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/163522.shtml
英文地址,請注明出處:http://en.pswp.cn/news/163522.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

MySQL -- JDBC

1、JDBC是什么&#xff1a; 是SUN公司制定的一套接口(interface)。接口都有調用者和實現者。面向接口調用、面向接口寫實現類&#xff0c;這都屬于面向接口編程。 2、在使用JDBC的六個步驟&#xff1a; 1.注冊驅動&#xff08;告訴Java程序&#xff0c;即將連接的是哪個品牌…

業務系統上云后,如何滿足員工移動辦公快速訪問業務系統的需求?

在企業業務上云的大趨勢下&#xff0c;SaaS應用、云端辦公協同工具等多種遠程辦公應用系統開始大規模普及&#xff0c;企業員工可以隨時隨地訪問云上業務數據。然而現實情況卻十分“打臉”&#xff0c;企業隨時隨地要訪問云上業務的需求越迫切&#xff0c;問題就越大。由于多種…

算法通關村第十二關|白銀|字符串經典基礎面試題

1.反轉問題 1.1 反轉字符串 原題&#xff1a;力扣344. 要求原地修改。 public void reverseString(char[] s) {if (s null || s.length() 0) {return;}int n s.length;for (int left 0, right n - 1; left < right; left, right--) {char temp s[left];s[left] s…

小程序訂閱消息

wx.requestSubscribeMessage({tmplIds: [2IdqlWrqSbjAurzIuW8imeK-ftS8gbhYdZ0icdE],success(res) {console.log(res);// 處理用戶授權結果},fail(err) {console.error(err);// 處理授權請求失敗}});

白楊SEO:2B企業營銷是什么?當下主流的短視頻直播平臺有哪些?企業營銷要做短視頻直播選哪個平臺更好?

今天白楊SEO就正式來講講2B企業營銷選擇哪個短視頻直播平臺更好&#xff1f; 圖片在公眾號&#xff1a;白楊SEO上看。 文章大綱提前看&#xff1a; 1、先說說2B企業營銷是什么&#xff1f; 2、當下主流的短視頻直播平臺有哪些&#xff1f; 3、2B企業營銷要做短視頻直播選哪…

重磅!1區、60年老牌期刊被踢?共5本被剔除!11月SCIE/SSCI期刊目錄更新!

期刊動態&#xff1a;2023年11月SCI、SSCI期刊目錄更新 2023年11月20日&#xff0c;科睿唯安更新了WOS期刊目錄&#xff0c;繼上次10月WOS期刊目錄剔除7本SCIE&SSCI期刊之后&#xff0c;此次11月更新又有5本期刊發生變動&#xff0c;其中有4本SCIE期刊被剔除&#xff0c;1…

Postgresql根據兩表相同字段更新其中一個表的其他數據

有兩個表 table1&#xff08;id,pcode,pname,type&#xff09; 初始數據只有id、pcode&#xff0c;pname、type為空table2&#xff08;id,pcode,pname,type&#xff09; 根據table1和table的相同字段pcode&#xff0c;用table2的數據更新table1的pname和type字段。 例如&…

微信運營神器:從群發到批量添加,讓你的微信營銷更輕松

在這個數字化時代&#xff0c;微信已經成為了我們生活中不可或缺的一部分。對于許多企業和個人來說&#xff0c;微信營銷也是非常重要的一部分。但是&#xff0c;微信營銷并不是一件容易的事情&#xff0c;需要花費大量的時間和精力。為了解決這個問題&#xff0c;今天我們將向…

Linux本地MinIO存儲服務遠程調用上傳文件

&#x1f525;博客主頁&#xff1a; 小羊失眠啦. &#x1f3a5;系列專欄&#xff1a;《C語言》 《數據結構》 《Linux》《Cpolar》 ??感謝大家點贊&#x1f44d;收藏?評論?? 前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;…

淘寶返利APP草柴如何綁定淘寶賬號?

草柴APP是一款淘寶、天貓、京東大額優惠券領取及購物返利省錢工具。通過草柴APP綁定淘寶賬號&#xff0c;可領取淘寶大額內部隱藏優惠券&#xff0c;領取成功再購物可享券后價優惠&#xff0c;確認收貨后可獲得淘寶返利。 淘寶返利APP草柴如何綁定淘寶賬號&#xff1f; 1、手…

Docker 快速搭建 Gitlab 服務

linux環境&#xff1a; 使用 vim 編輯 hosts 文件&#xff1a; vim /etc/hosts按 I 進入編輯模式&#xff0c;在文件末行追加上虛擬機的 IP 和要設置的域名&#xff1a; 192.168.1.17 gitlab.kunwu.toplwindows環境&#xff1a; Windows 系統的 hosts 文件位于 C:\Windows\S…

萬賓科技智能井蓋傳感器效果,特點有哪些?

現在城市發展越來越好&#xff0c;對基礎設施的改造越來越多&#xff0c;比如修路搭橋、整改生態等都是為民服務的好工程。平時走在路上我們享受著平整的路面&#xff0c;井然有序的交通也為我們帶來很大的方便。但是一個又一個的井蓋看起來無關緊要&#xff0c;實際上如果路上…

Doris的編譯與安裝(二)

安裝 Doris&#xff0c;需要先通過源碼編譯&#xff0c;主要有兩種方式&#xff1a; 使用 Docker 開發鏡像編譯&#xff08;推薦&#xff09;、直接編譯。 直接編譯的方式&#xff0c;可以參考官網&#xff1a;https://doris.apache.org/zh-CN/installing/compilation.html …

投標文件的注意事項

一、檢查標書 1.1有時候標書需要從別的地方復制黏貼文件&#xff0c;記住復制內容可以&#xff0c;但是不要復制“落款和時間”的格式&#xff0c;落款和時間的格式借鑒你的招標文件中給響應文件格式的落款和時間&#xff0c;切記&#xff01; 1.2檢查標書是否有空頁&#xf…

數據科學導論——數據預處理

第1關:引言-根深之樹不怯風折,泉深之水不會涸竭 第2關:數據清理-查漏補缺 import numpy as np import pandas as pd import matplotlib.pyplot as plt def student():train = pd.read_csv(Task1/diabetes_null.csv, na_values=[#NAME?])train[Insulin] = train[Insulin].f…

maxwell采集數據到kafka報錯

問題&#xff1a; 啟動maxwell后出現數據更新后就出現以下報錯。 13:29:14,727 ERROR MaxwellKafkaProducer - TimeoutException Position[BinlogPosition[binlog.000002:12215591], lastHeartbeat1700717043797] -- maxWellData: medical:consultation:[(id,212)] 13:29:14,7…

Raptor安裝

Raptor官網:https://raptor.martincarlisle.com/ 進入官網后&#xff0c;下拉找到 Download RAPTOR&#xff0c;windows系統的選擇Windows Users 下載完成后打開&#xff0c;選擇“next” 修改一下路徑&#xff0c;不要放到C: 繼續next 完結撒花

vue3的單組件的編寫(三)【響應式 API 之 toRef 與 toRefs】

響應式 API 之 toRef 與 toRefs 前面講了 ref 和 reactive 這兩種響應式API &#xff0c;為了方便開發者使用&#xff0c;vue3 還出了兩個用來 reactive 轉換為 ref 的API&#xff0c;分別是 toRef 和 toRefs 。 &#x1f308;什么是toRef 與 toRefs 這兩個API看拼寫能猜到&…

css漸變詳解(重復性線性漸變、徑向漸變、重復性徑向漸變的使用)

目錄 線性漸變 重復性線性漸變 徑向漸變 重復性徑向漸變的使用 線性漸變 線性漸變是向下、向上、向左、向右、對角方向的顏色漸變。 其語法格式為&#xff1a; background-image: linear-gradient(side-or-corner|angle, linear-color-stop); 參數說明如下&#xff1a; …

物聯網網關在智慧農業行業的應用案例

物聯網網關在智慧農業行業的應用案例 隨著科技的發展和普及&#xff0c;智慧農業已經成為了農業領域的一個重要趨勢。在智慧農業中&#xff0c;物聯網網關是一個非常重要的組成部分&#xff0c;它能夠實現對農業設備和環境的實時監控和控制&#xff0c;從而提高農業生產效率和…