存儲過程基本了解

文章目錄

  • 介紹
  • 存儲過程示例
    • 1. 目的
    • 2. 輸入參數
    • 3. 輸出參數
    • 4. 執行邏輯
    • 5. 返回值
    • 6. 示例用法
    • 7. 注意事項
  • 存儲過程的關鍵字有哪些
  • 簡單實操

介紹

存儲過程是一組預編譯的SQL語句,以及流程控制語句,封裝在數據庫服務器中并可以被重復調用。它們可以接收參數、執行邏輯和返回結果。存儲過程通常用于實現復雜的業務邏輯和數據操作,提供了以下幾個主要優勢:

  1. 代碼重用和模塊化: 存儲過程可以將復雜的業務邏輯封裝成一個可重復調用的單元。這樣可以提高代碼的重用性和維護性,避免了重復編寫相同的代碼邏輯。
  2. 性能優化: 存儲過程在數據庫服務器上進行預編譯,并可被緩存,從而提供更高的性能。通過減少網絡開銷和減少解析時間,存儲過程可以顯著提升查詢和事務處理的性能。
  3. 安全性和權限控制: 存儲過程可以通過授權機制實現對數據庫對象的訪問控制。數據庫管理員可以授予或撤銷用戶對存儲過程的執行權限,從而保護敏感數據和確保數據的安全性。
  4. 減少數據傳輸量: 存儲過程可以在數據庫服務器上執行大量的數據處理和計算,只將結果返回給客戶端,減少了數據傳輸的量,提高了網絡傳輸效率。
  5. 事務處理和數據一致性: 存儲過程可以包含多個SQL語句,并可以在一個事務中執行。這樣可以確保邏輯上相關的操作要么全部成功要么全部失敗,從而保持數據的一致性。
  6. 簡化客戶端代碼: 存儲過程可以將復雜的業務邏輯移至數據庫服務器端,減少了客戶端的代碼量,使客戶端更加簡潔和易于維護。

存儲過程示例

1. 目的

獲取特定客戶的信息,包括客戶姓名、電話號碼和地址。

2. 輸入參數

  • @CustomerID (INT):客戶ID,用于指定要查詢的客戶。

3. 輸出參數

  • @CustomerName (VARCHAR):客戶姓名。
  • @PhoneNumber (VARCHAR):客戶電話號碼。
  • @Address (VARCHAR):客戶地址。

4. 執行邏輯

CREATE PROCEDURE GetCustomerInfo@CustomerID INT
AS
BEGINSELECT CustomerName, PhoneNumber, AddressFROM CustomersWHERE CustomerID = @CustomerID;
END;

5. 返回值

6. 示例用法

EXEC GetCustomerInfo @CustomerID = 123;

7. 注意事項

  • 調用該存儲過程時,需傳入有效的客戶ID。
  • 請注意存儲過程中涉及到的表和字段名稱,確保與實際數據庫結構匹配。

下面是一個示例的復雜存儲過程代碼,該存儲過程用于計算訂單總金額并更新訂單狀態:

CREATE PROCEDURE CalculateOrderTotalAndSetStatus@OrderID INT
AS
BEGINDECLARE @TotalAmount DECIMAL(10, 2);DECLARE @ItemCount INT;DECLARE @OrderStatus VARCHAR(20);-- 計算訂單總金額SELECT @TotalAmount = SUM(UnitPrice * Quantity)FROM OrderDetailsWHERE OrderID = @OrderID;-- 獲取訂單中商品數量SELECT @ItemCount = COUNT(*)FROM OrderDetailsWHERE OrderID = @OrderID;-- 根據訂單總金額和商品數量設置訂單狀態IF @TotalAmount > 1000SET @OrderStatus = 'High Value';ELSESET @OrderStatus = 'Normal';-- 更新訂單信息表中的訂單狀態和總金額UPDATE OrdersSET TotalAmount = @TotalAmount,ItemCount = @ItemCount,Status = @OrderStatusWHERE OrderID = @OrderID;PRINT 'Order total amount calculated and status updated successfully.';
END;

在上面的示例中,存儲過程CalculateOrderTotalAndSetStatus接收一個訂單ID作為輸入參數,然后執行以下操作:

  1. 計算訂單的總金額;
  2. 獲取訂單中商品的數量;
  3. 根據總金額設置訂單狀態為“High Value”或“Normal”;
  4. 更新訂單信息表中的總金額、商品數量和狀態。

存儲過程的關鍵字有哪些

  1. CREATE PROCEDURE:用于創建存儲過程。
  2. ALTER PROCEDURE:用于修改現有存儲過程的定義。
  3. DROP PROCEDURE:用于刪除存儲過程。
  4. EXECEXECUTE:用于執行存儲過程。
  5. WITH ENCRYPTION:用于加密存儲過程的源代碼,以保護存儲過程的邏輯。
  6. WITH RECOMPILE:用于指示數據庫引擎在每次執行存儲過程時重新編譯存儲過程。
  7. AS:用于指定存儲過程的主體部分。
  8. BEGINEND:用于定義存儲過程的代碼塊。
  9. DECLARE:用于聲明變量或游標。
  10. SET:用于給變量賦值。
  11. SELECT:用于從表中檢索數據。
  12. UPDATEINSERTDELETE:用于更新、插入和刪除數據。
  13. IFELSEIFELSE:用于條件控制。
  14. WHILEBEGIN…END WHILE:用于循環控制。
  15. RETURN:用于從存儲過程中返回值。
  16. OUTPUT:用于輸出參數。
  17. INOUT:用于輸入輸出參數。

簡單實操

在存儲過程中可以包含多個select語句,顯示姓名中含有”張“字職工信息及其所在的倉庫信息,

create procedure pro_sql5
as
beginselect * from 職工 where 姓名 like '%張%'select * from 倉庫 where 倉庫號 in(select 倉庫號 from 職工 where 姓名 like '%張%')
endgo
execute pro_sql5

帶有輸入參數的存儲過程 找出三個數字中的最大數:

create proc proc_sql6
@num1 int,
@num2 int,
@num3 int
as
begindeclare @max intif @num1>@num2set @max = @num1else set @max = @num2if @num3 > @maxset @max = @num3print '3個數中最大的數字是:' + cast(@max as varchar(20))
end

求階乘之和 如6! + 5! + 4! + 3! + 2! + 1

execute proc_sql7 6  

帶有輸入參數的數據查詢功能的存儲過程

create proc proc_sql8@mingz int,@maxgz int
as
beginselect * from 職工 where 工資>@mingz and 工資<@maxgz
end

帶輸入和輸出參數的存儲過程:顯示指定倉庫號的職工信息和該倉庫號的最大工資和最小工資

create proc proc_sql9@cangkuhao varchar(50),@maxgz int output,@mingz int output
as
beginselect * from 職工 where 倉庫號=@cangkuhaoselect @maxgz=MAX(工資) from 職工 where 倉庫號=@cangkuhaoselect @mingz=MIN(工資) from 職工 where 倉庫號=@cangkuhao
end

帶有登錄判斷功能的存儲過程

create proc proc_sql10  @hyuer varchar(50),  @hypwd varchar(50)  
as  
begin  if @hyuer = 'hystu1'  begin  if @hypwd = '1111'  print '用戶名和密碼輸入正確'  else   print '密碼輸入錯誤'  end  else if @hyuer = 'hystu2'  begin  if @hypwd = '2222'  print '用戶名和密碼輸入正確'  else   print '密碼輸入錯誤'  end  else if @hyuer = 'hystu3'  begin  if @hypwd = '3333'  print '用戶名和密碼輸入正確'  else   print '密碼輸入錯誤'  end  else   print '您輸入的用戶名不正確,請重新輸入'  
end  

帶有判斷條件的插入功能的存儲過程

reate proc proc_sq111  @zghao varchar(30),  @ckhao varchar(30),  @sname varchar(50),  @sex varchar(10),  @gz int  
as  
begin  if Exists(select * from 職工 where 職工號=@zghao)  print '該職工已經存在,請重新輸入'  else   begin  if Exists(select * from 倉庫 where 倉庫號=@ckhao)  begin  insert into 職工(職工號, 倉庫號, 姓名, 性別, 工資)   values(@zghao, @ckhao, @sname, @sex, @gz)  end  else  print '您輸入的倉庫號不存在,請重新輸入'  end  
end  

點贊.jpg

各位看官》創作不易,點個贊!!!
諸君共勉:萬事開頭難,只愿肯放棄。

免責聲明:本文章僅用于學習參考

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

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

相關文章

5G 網絡建設【華為OD機試-JAVAPythonC++JS】

題目描述 現需要在某城市進行5G網絡建設&#xff0c;已經選取N個地點設置5G基站&#xff0c;編號固定為1到N&#xff0c;接下來需要各個基站之間使用光纖進行連接以確保基站能互聯互通&#xff0c;不同基站之間架設光纖的成本各不相同&#xff0c;且有些節點之間已經存在光纖相…

CentOS7安裝MySQL5.7

查看并卸載系統自帶的 Mariadb rpm -qa|grep mariadb rpm -e --nodeps mariadb-libs-5.5.68-1.el7.x86_64 檢查系統是否安裝過MySQL rpm -qa | grep mysql 檢查有無MySQL用戶組 cat /etc/group | grep mysql cat /etc/passwd | grep mysql 創建MySQL用戶組和用戶 groupadd m…

特斯拉一面算法原題

來自太空的 X 帖子 埃隆馬斯克&#xff08;Elon Musk&#xff09;旗下太空探索技術公司 SpaceX 于 2 月 26 號&#xff0c;從太空往社交平臺 X&#xff08;前身為推特&#xff0c;已被馬斯克全資收購并改名&#xff09;發布帖子。 這是 SpaceX 官號首次通過星鏈來發送 X 帖子&a…

SpringBoot+Vue實戰:打造企業級項目管理神器

??計算機編程指導師 ??個人介紹&#xff1a;自己非常喜歡研究技術問題&#xff01;專業做Java、Python、微信小程序、安卓、大數據、爬蟲、Golang、大屏等實戰項目。 ??實戰項目&#xff1a;有源碼或者技術上的問題歡迎在評論區一起討論交流&#xff01; ?? Java實戰 |…

【YOLO】INT8量化C++版

三、INT8量化 C++ 3.1下載coco128數據集 cd /mnt/workspace/yolov5/data/scripts sh get_coco128.sh3.2 模型準備 #onnx轉simple_onnx pip install onnx-simplifier python -m onnxsim yolov5s.onnx yolov5s-simple.onnx3.3 下載量化代碼庫 git clone https://github.com/W…

水豚鼠標助手 強大的鼠標美化工具

水豚鼠標助手 水豚鼠標助手是一款 鼠標換膚、屏幕畫筆、放大鏡、聚光燈、屏幕放大、倒計時功能的強大屏幕演示工具。 軟件助手獲取 水豚鼠標助手1.0.0 安裝教程 第一步&#xff1a;下載后&#xff0c;雙擊軟件安裝包 第二步&#xff1a;Windows可能會出現提示彈窗&#xff…

【已親測有效】如何徹底刪除nodejs,避免影響安裝新版本

第一步開始菜單搜索uninstall node.js&#xff0c;點擊之后等待刪除&#xff08;刪除node_modules文件夾以及以下這些文件&#xff09; 第二步手動刪除nodejs下載位置的其他文件夾。&#xff08;就是另外自己新建的兩個文件夾node_cache和node_global&#xff09; 到這里其實應…

uniapp實現多行文本溢出超過指定行數 展開 收起

一、組件封裝 <template><view class"multiline"><view class"info"><view :class"{hide:!iSinfo}" :style"!iSinfo?computedStyle:"><view :style"{ color: textColor,fontWeight:fontWeight,font…

網絡安全課程VIP介紹(比同行便宜)

免責聲明 本文發布的工具和腳本&#xff0c;僅用作測試和學習研究&#xff0c;禁止用于商業用途&#xff0c;不能保證其合法性&#xff0c;準確性&#xff0c;完整性和有效性&#xff0c;請根據情況自行判斷。如果任何單位或個人認為該項目的腳本可能涉嫌侵犯其權利&#xff0c…

Javaweb day7

前后端分類開發 Yapi 環境配置 vue項目簡介 項目啟動 更改端口號 vue項目開發流程

【c++設計模式05】創建型3:抽象工廠模式(Abstact Factory Pattern)

【c設計模式05】創建型3&#xff1a;抽象工廠模式&#xff08;Abstact Factory Pattern&#xff09; 一、工廠模式二、抽象工廠模式三、UML類圖四、demo五、總結 原創作者&#xff1a;鄭同學的筆記 原創地址&#xff1a;https://zhengjunxue.blog.csdn.net/article/details/132…

Spring 源碼解析

文章目錄 前言相關Spring的定義接口整體代碼StartupStep contextRefresh this.applicationStartup.start("spring.context.refresh")prepareRefresh()obtainFreshBeanFactory()registerBeanPostProcessors(beanFactory)SpringAOP原碼流程EnableAspectJAutoProxyAnno…

Linux調試器-gdb使用與馮諾依曼體系結構

提示&#xff1a;文章寫完后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右邊的幫助文檔 文章目錄 前言 Linux調試器-gdb使用 1. 背景 2. 開始使用 馮諾依曼體系結構 總結 前言 世上有兩種耀眼的光芒&#xff0c;一種是正在升起的太陽&#xff0c;一種是正在努力學…

計算機網絡-網絡互連和互聯網(五)

1.路由器技術NAT&#xff1a; 網絡地址翻譯&#xff0c;解決IP短缺&#xff0c;路由器內部和外部地址進行轉換。靜態地址轉換&#xff1a;靜態NAT&#xff08;一對一&#xff09; 靜態NAT&#xff0c;內外一對一轉換&#xff0c;用于web服務器&#xff0c;ftp服務器等固定IP的…

(定時器/計數器)中斷系統(詳解與使用)

講解 簡介 定時器/計數器 定時器實際上也是計數器,只是計數的是固定周期的脈沖 定時和計數只是觸發來源不同(時鐘信號和外部脈沖)其他方面是一樣的。 定時器在單片機內部就像一個小鬧鐘一樣,根據時鐘的輸出信號,每隔“一秒”,計數單元的數值就增加一,當計數單元數值…

C++:String類的使用

創作不易&#xff0c;感謝三連&#xff01;&#xff01; 在C語言中&#xff0c;我們想要存儲字符串的話必須要用字符數組 char str[]"hello world"這其實是將在常量區的常量字符串拷貝到數組中&#xff0c;我們會在數組的結尾多開一個空間存儲\0&#xff0c;這樣我…

前端構建之CERT_HAS_EXPIRED和certificate has expired解決方案

問題 2024年 1 月 22 日&#xff0c;淘寶原鏡像域名&#xff08;registry.npm.taobao.org&#xff09;的 HTTPS 證書正式到期。如果想要繼續使用&#xff0c;需要將 npm 源切換到新的源&#xff08;registry.npmmirror.com&#xff09;&#xff0c;否則會報錯。 報錯信息為&a…

Consul服務注冊與發現 Consul配置步驟

Consul服務注冊與發現 Consul配置步驟 consul下載地址 Install | Consul | HashiCorp Developer 啟動需要在 下載好的文件夾里 用cmd 運行consul agent -dev啟動consul Consul配置 配置pom <!--SpringCloud consul config--> <dependency><groupId>org…

【leetcode】回文子串 動態規劃

/*** param {string} s* return {number}*/ var countSubstrings function(s) {let dpnew Array(s.length).fill().map(()>new Array(s.length).fill(false));let num0;for(let i0;i<s.length;i){for(let j0;j<i;j){//在首尾相等時&#xff0c;如果長度時1或者2&…

C++筆記(三)--- 函數重載

目錄 子類繼承父類重載 類成員函數重載 繼承和組合的三種方式請看我上一篇文章 C筆記&#xff08;二&#xff09;--- 繼承和組合-CSDN博客 子類繼承父類重載 當子類繼承父類之后&#xff0c;子類重新定義了一個和父類完全相同函數名稱的函數時&#xff0c;會將父類所有相同…