Mysql存儲過程(附案例)

?

文章目錄

  • 存儲過程概述
  • 1、基本語法
  • 2、變量
    • ①、系統變量
    • ②、用戶自定義變量
    • ③、局部變量
  • 3、流程控制語句
    • ①、if語句
    • ②、參數
    • ③、case語句
    • ④、while語句
    • ⑤、repeat語句
    • ⑥、loop語句
    • ⑦、cursor游標
    • ⑧、handler
  • 4、存儲函數

存儲過程概述

存儲過程是事先經過編譯并存儲在數據庫中的一段 SQL 語句的集合,調用存儲過程可以簡化應用開發人員的很多工作,減少數據在數據庫和應用服務器之間的傳輸,提高數據處理的效率

存儲過程思想上很簡單,就是數據庫 SQL 語言層面的代碼封裝與重用。

優點:

  1. 減少網絡傳輸:在數據庫端執行,降低應用服務器與數據庫間的數據交互

  2. 性能提升:預編譯減少了重復解析和優化,提高執行效率

  3. 簡化開發:封裝復雜邏輯,減少應用層代碼量,便于調用

1、基本語法

  • 創建:
CREATE PROCEDURE 存儲過程名稱 ([參數列表]) BEGIN -- SQL語句 END;

舉例:

-- 創建
CREATE PROCEDURE p1()
BEGINSELECT COUNT(*) FROM student;END

運行結果:
可以看到在functions下多了一個p1函數
在這里插入圖片描述

  • 調用:
CALL 存儲名稱 ([參數]);

?舉例:

CALL p1();

運行結果:
在這里插入圖片描述

  • 查看
SELECT * FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_SCHEMA = 'xxx'; -- 查詢指定數據庫的存儲過程及狀態信息
SHOW CREATE PROCEDURE 存儲過程名稱; -- 查詢某個存儲過程的定義

舉例:

-- 查詢指定數據庫的存儲過程及狀態信息
SELECT * FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_SCHEMA = 'school_db';-- 查詢某個存儲過程的定義
SHOW CREATE PROCEDURE p1;

運行結果:

分別是兩條語句的運行結果:
在這里插入圖片描述
在這里插入圖片描述

  • 刪除
DROP PROCEDURE [IF EXISTS] 存儲過程名稱;

舉例:
這樣就刪除成功了:

DROP PROCEDURE p1;

2、變量

①、系統變量

系統變量由Mysql服務器提供,不由用戶定義,屬于服務器層面,分為全局變量與會話變量。

全局變量:無論開多少個會話,變量值都是一樣的,
會話變量:只在當前會話生效的變量。

在這里插入圖片描述

像在navicat中,我們點擊創建這三個query,就是三個不同的會話

查看語句:

-- 查看會話變量
SHOW SESSION VARIABLES;
-- 查看全局變量
SHOW GLOBAL VARIABLES;-- 模糊查詢
SHOW SESSION VARIABLES like 'auto%';
SHOW GLOBAL VARIABLES like 'auto%';-- 直接選擇具體的變量
SELECT @@global.autocommit;

查詢結果:

在這里插入圖片描述
變量可以看到有很多。

模糊查詢結果:
在這里插入圖片描述
具體查詢結果:
在這里插入圖片描述
更改語句:

-- 設置會話變量
SET SESSION autocommit = 0;
-- 設置全局變量
SET GLOBAL autocommit = 0;

②、用戶自定義變量

用戶定義變量是用戶根據需要自己定義的變量,用戶變量不用提前聲明,在用的時候直接用“@變量名”使用就可以。其作用域為當前連接。

使用方式:

-- 設置變量SET @user_name := 'zhangsan';select COUNT(*) into @num from student;-- 使用變量SELECT @num, @user_name;

注意點:賦值時使用 := 來賦值,然后賦值的話,也可以將查詢的結果賦值給一個變量,如第二條查詢語句。最后如果要查看自定義變量則使用最后一條的語法查詢,查詢結果如下:
在這里插入圖片描述

③、局部變量

局部變量是根據需要定義的在局部生效的變量,訪問之前,需要DECLARE聲明。可用作存儲過程中的局部變量和輸入參數,局部變量的范圍是在其聲明的BEGIN … END塊

使用方式:

CREATE PROCEDURE p2()
BEGIN-- 局部變量定義,前面為變量名,后面為變量類型,如int、varchar等。DECLARE stu_count int;-- 對變量賦值select COUNT(*) INTO stu_count from student;-- 查詢變量select stu_count;
END-- 調用存儲過程
CALL p2();

調用結果:
在這里插入圖片描述

3、流程控制語句

這部分其實和編程語言的流程控制基本相同,分支、循環,傳參等,我們直接實戰來演示。

①、if語句

根據分數判斷是否合格。

-- if
CREATE PROCEDURE p3()
BEGINDECLARE score INT DEFAULT 58;DECLARE result VARCHAR(10);-- if語句使用IF score >= 85 THENSET result = '優秀';ELSEIF score >= 60 THENSET result = '合格';ELSESET result = '不合格';end IF;-- 查詢結果SELECT result;
END
-- 調用流程
CALL p3();

運行結果:
在這里插入圖片描述

②、參數

只需要知道三個聲名參數的方法,分別是in、out、inout。

in用來聲名輸入參數,out用來聲名輸出參數,輸出參數一般由一個變量來接收。

-- 參數
-- in表示聲名輸入參數,out表示聲名返回結果
CREATE PROCEDURE p4(in score INT, out result VARCHAR(10))
BEGIN-- if語句使用IF score >= 85 THENSET result = '優秀';ELSEIF score >= 60 THENSET result = '合格';ELSESET result = '不合格';end IF;
END
-- 調用過程
CALL p4(58, @result);SELECT @result;

查詢結果:
在這里插入圖片描述

inout表明輸入和輸出都是同一個變量。

-- 將數字換成百分制的。
CREATE PROCEDURE p5(inout score DOUBLE)
BEGINset score := score * 0.01
END;set @SCORE = 78
-- 調用過程
CALL p5(@SCORE);SELECT @SCORE;

運行結果:
在這里插入圖片描述

③、case語句

根據月份判斷第幾季度。

-- case語句
CREATE PROCEDURE p6(in month INT)
BEGINdeclare result VARCHAR(10);casewhen month >= 1 and month <= 3 thenset result := '第一季度';when month >= 4 and month <= 6 thenset result := '第二季度';when month >= 7 and month <= 9 thenset result := '第三季度';when month >= 10 and month <= 12 thenset result := '第四季度';else set result := '非法參數';end case;select result;
END;CALL p6(7);

運行結果:
在這里插入圖片描述

④、while語句

求n到1的累加值。

CREATE PROCEDURE p7(in n INT)
BEGINdeclare total INT DEFAULT 0;while n>0 doset total := total + n;set n := n - 1;end while;select total;
END;CALL p7(10);

運行結果:
在這里插入圖片描述

⑤、repeat語句

repeat是有條件的循環退出語句,類似c語言的do while語句

CREATE PROCEDURE p8(in n INT)
BEGINdeclare total INT DEFAULT 0;repeatset total := total + n;set n := n - 1;until n <= 0end repeat;select total;
END;CALL p8(10);

運行結果:
在這里插入圖片描述

⑥、loop語句

里面注意需要給loop代碼命個名,退出循環需要指定loop的名稱。 leave等同于c語言中的break, iterate 效果等同于c語言中的continue

需求:從n 到 1中所有偶數相加的和

CREATE PROCEDURE p9(in n INT)
BEGINdeclare total INT DEFAULT 0;sum:loopif n<=0 thenleave sum;end if;if n%2=1 thenset n := n - 1;iterate sum;end if;set total := total + n;set n := n - 1;end loop sum;select total;
END;CALL p9(10);

運行結果:
在這里插入圖片描述

⑦、cursor游標

游標 (CURSOR) 是用來存儲查詢結果集的游標類型,在存儲過程和函數中可以使用游標來循環處理查詢結果集中的每行記錄。

游標可以存儲sql查詢的結果集合,而之前的參數只能傳單行單列的數據。

聲明游標:

DECLARE 游標名稱 CURSOR FOR 查詢語句;

打開游標:

OPEN 游標名稱;

獲取游標記錄:

FETCH 游標名稱 INTO 變量[變量];

關閉游標:

CLOSE 游標名稱;

需求:將查詢到的數據,存儲到新表tb_user_pro中,游標語法如下:

CREATE PROCEDURE p10(in uid INT)
BEGIN-- 定義游標與變量declare u_name varchar(50);declare u_gender varchar(50);declare u_cursor cursor for select stu_name,gender from student where stu_id <= uid;-- 創建測試表create table if not exists tb_user_pro(id int PRIMARY key auto_increment,name2 VARCHAR(50),gender VARCHAR(50));-- 開啟游標open u_cursor; WHile true dofetch u_cursor into u_name, u_gender; -- 獲取游標中的數據并賦值給變量insert into tb_user_pro(name2, gender) VALUES (u_name, u_gender); -- 執行插入語句end while;-- 關閉游標close u_cursor;
END;CALL p10(3);

運行結果:
在這里插入圖片描述

可以看到,我們成功完成了功能,但是在執行的時候,有一些問題,在while true的時候,我們沒有設置跳出循環的邏輯,導致結果正確,但執行會報錯:
在這里插入圖片描述

⑧、handler

條件處理程序 (Handler) 可以用來定義在流程控制結構過程中遇到問題時相應的處理步驟。具體語法為:

DECLARE handler_action HANDLER FOR condition_value [condition_value]... statement;handler_action
CONTINUE: 繼續執行當前程序
EXIT: 終止執行當前程序condition_value
SQLSTATE sqlstate_value: 狀態碼,如 02000
SQLWARNING: 所有以01開頭的SQLSTATE代碼的警告
NOT FOUND: 所有以02開頭的SQLSTATE代碼的警告SQLEXCEPTION: 所有沒有被SQLWARNING 或 NOT FOUND捕獲的SQLSTATE代碼的警告

這里我們直接基于上一個案例來解釋語法怎么用

我們在上一個案例的PROCEDURE中定義一個條件處理程序,在報錯時就會執行這個程序:

-- exit表示退出程序,
-- SQLSTATE '02000' 等價于 not found 
-- 該程序最后執行的語句為:close u_cursor
declare exit handler for SQLSTATE '02000' close u_cursor;

最后運行的時候,發現程序就不再報錯了,功能也正常了。

4、存儲函數

存儲函數是否有可能返回值的存儲過程,存儲函數的參數只能是IN類型的。具體語法如下:

CREATE FUNCTION 存儲函數名稱( [參數列表] )
RETURNS type [characteristic …]
BEGIN-- SQL語句RETURN;
END;characteristic說明:DETERMINISTIC: 相同的輸入參數總是產生相同的結果
NO SQL: 不包含SQL語句。
READS SQL DATA: 包含讀取數據的語句,但不包含寫入數據的語句。

舉例說明,
功能:實現從n到1的累加:

create function fun1(n INT)
-- 必須指定返回類型 和 characteristic
returns int DETERMINISTICBEGINdeclare total INT default 0;while n > 0 doset total := total + n;set n := n - 1;end while;return total;
END;select fun1(100)

運行結果:
在這里插入圖片描述

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

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

相關文章

小波變換+注意力機制成為nature收割機

小波變換作為一種新興的信號分析工具&#xff0c;能夠高效地提取信號的局部特征&#xff0c;為復雜數據的處理提供了有力支持。然而&#xff0c;它在捕捉數據中最為關鍵的部分時仍存在局限性。為了彌補這一不足&#xff0c;我們引入了注意力機制&#xff0c;借助其能夠強化關注…

SQLMesh 增量模型從入門到精通:5步實現高效數據處理

本文深入解析 SQLMesh 中的增量時間范圍模型&#xff0c;介紹其核心原理、配置方法及高級特性。通過實際案例說明如何利用該模型提升數據加載效率&#xff0c;降低計算資源消耗&#xff0c;并提供配置示例與最佳實踐建議&#xff0c;幫助讀者在實際項目中有效應用這一強大功能。…

Android應用內存分析與優化 - 工具篇之Booster

序 在原理篇中&#xff0c;我們發現在App內存的分布中&#xff0c;Code是占大頭的部分&#xff0c;所以我們可以從App體積方面想辦法&#xff0c;通過減小App體積達到降低內存的目的&#xff0c;同時&#xff0c;根據權威的機構分析&#xff0c;體積與用戶下載和留存有很大的聯…

金屬加工液展|切削液展|2025上海金屬加工液展覽會

2025上海金屬加工液展覽會 時間&#xff1a;2025年12月2-4日 地點&#xff1a;上海新國際博覽中心 2025上海金屬加工液展規劃30000平方米展覽規模&#xff0c;預設展位1200個&#xff0c;將為國內外加工液產業提供一個集“展示、合作、交易、發展”于一體的綜合性平臺&#…

React學習———Redux 、 React Redux和react-persist

Redux Redux是一個流行的JavaScript狀態管理庫&#xff0c;通常用于React等前端框架結合使用。Redux 的設計思想是讓應用的狀態變得可預測、可追蹤、易于調試和測試。 Redux的核心l理念 單一數據源&#xff1a;整個應用的狀態被存儲在一個唯一的Store對象中&#xff0c;所有…

Python字符串常用方法詳解

文章目錄 Python字符串常用方法詳解一、字符串大小寫轉換方法(常用)1. 基礎大小寫轉換2. 案例&#xff1a;驗證碼檢查&#xff08;不區分大小寫&#xff09; 二、字符串查找與替換方法1. 查找相關方法2. 替換相關方法 三、字符串判斷方法1. 內容判斷方法 四、字符串分割與連接方…

MyBatis—動態 SQL

MyBatis—動態 SQL 一、動態 SQL 的核心作用 動態 SQL 主要解決以下問題&#xff1a; 靈活性&#xff1a;根據不同的輸入參數生成不同的 SQL 語句&#xff08;如條件查詢、批量操作&#xff09;。 可維護性&#xff1a;減少重復代碼&#xff0c;通過標簽化邏輯提高 SQL 可讀…

Python機器學習筆記(二十五、算法鏈與管道)

對于許多機器學習算法,特定數據表示非常重要。首先對數據進行縮放,然后手動合并特征,再利用無監督機器學習來學習特征。因此,大多數機器學習應用不僅需要應用單個算法,而且還需要將許多不同的處理步驟和機器學習模型鏈接在一起。Pipeline類可以用來簡化構建變換和模型鏈的…

YOLOv3深度解析:多尺度特征融合與實時檢測的里程碑

一、YOLOv3的誕生&#xff1a;繼承與突破的起點 YOLOv3作為YOLO系列的第三代算法&#xff0c;于2018年由Joseph Redmon等人提出。它在YOLOv2的基礎上&#xff0c;針對小目標檢測精度低、多類別標簽預測受限等問題進行了系統性改進。通過引入多尺度特征圖檢測、殘差網絡架構和獨…

已解決(親測有效!):安裝部署Docker Deskpot之后啟動出現Docker Engine Stopped!

文章目錄 已解決&#xff1a;安裝部署Docker Deskpot之后啟動出現Docker Engine Stopped&#xff01;個人環境介紹自己的解決問題思路&#xff08;詳細過程附截圖&#xff09;1.打開控制面板2.點擊程序和功能3.點擊啟動或關閉windows功能4.Hyper-V5.右鍵菜單欄的windows圖標點擊…

PCIE接收端檢測機制分析

PCIE接收端檢測機制分析 1、PCIE的接收端檢測機制 接收器檢測電路作為發射器的一部分實現&#xff0c;必須正確檢測是否存在與ZRX-DC參數&#xff08;40Ω-60Ω&#xff09;隱含的直流阻抗等效的負載阻抗。 接收器檢測序列的推薦行為如下&#xff1a; ?初始狀態?&#xff…

[模型部署] 3. 性能優化

&#x1f44b; 你好&#xff01;這里有實用干貨與深度分享?? 若有幫助&#xff0c;歡迎&#xff1a;? &#x1f44d; 點贊 | ? 收藏 | &#x1f4ac; 評論 | ? 關注 &#xff0c;解鎖更多精彩&#xff01;? &#x1f4c1; 收藏專欄即可第一時間獲取最新推送&#x1f514;…

InternVL3: 利用AI處理文本、圖像、視頻、OCR和數據分析

InternVL3推動了視覺-語言理解、推理和感知的邊界。 在其前身InternVL 2.5的基礎上,這個新版本引入了工具使用、GUI代理操作、3D視覺和工業圖像分析方面的突破性能力。 讓我們來分析一下是什么讓InternVL3成為游戲規則的改變者 — 以及今天你如何開始嘗試使用它。 InternVL…

鴻蒙 ArkUI - ArkTS 組件 官方 UI組件 合集

ArkUI 組件速查表 鴻蒙應用開發頁面上需要實現的 UI 功能組件如果在這 100 多個組件里都找不到&#xff0c;那就需要組合造輪子了 使用技巧&#xff1a;先判斷需要實現的組件大方向&#xff0c;比如“選擇”、“文本”、“信息”等&#xff0c;或者是某種形狀比如“塊”、“圖…

HTTP GET報文解讀

考慮當瀏覽器發送一個HTTP GET報文時&#xff0c;通過Wireshark 俘獲到下列ASCII字符串&#xff1a; GET /cs453/index.html HTTP/1.1 Host: gaia.cs.umass.edu User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.2) Gecko/20040804 Netscape/7.2 (ax) Acc…

【Linux網絡】數據鏈路層

數據鏈路層 用于兩個設備&#xff08;同一種數據鏈路節點&#xff09;之間進行傳遞。 認識以太網 “以太網” 不是一種具體的網絡&#xff0c;而是一種技術標準&#xff1b;既包含了數據鏈路層的內容&#xff0c;也包含了一些物理層的內容。例如&#xff1a;規定了網絡拓撲結…

【打破信息差】萌新認識與入門算法競賽

閱前須知 XCPC萌新互助進步群2??&#xff1a;174495261 博客主頁&#xff1a;resot (關注resot謝謝喵) 針對具體問題&#xff0c;應當進行具體分析&#xff1b;并無放之四海而皆準的方法可適用于所有人。本人尊重并支持每位學習者對最佳學習路徑的自主選擇。本篇所列訓練方…

logrotate按文件大小進行日志切割

? 編寫logrotate文件&#xff0c;進行自定義切割方式 adminip-127-0-0-1:/data/test$ cat /etc/logrotate.d/test /data/test/test.log {size 1024M #文件達到1G就切割rotate 100 #保留100個文件compressdelaycompressmissingoknotifemptycopytruncate #這個情況服務不用…

2025認證杯二階段C題完整論文講解+多模型對比

基于延遲估計與多模型預測的化工生產過程不合格事件預警方法研究 摘要 化工生產過程中&#xff0c;污染物濃度如SO?和H?S對生產過程的控制至關重要。本文旨在通過數據分析與模型預測&#xff0c;提出一種基于延遲估計與特征提取的多模型預測方法&#xff0c;優化閾值設置&a…

前端精度問題全解析:用“挖掘機”快速“填平精度坑”的完美解決方案

寫在前面 “為什么我的計算在 React Native 中總是出現奇怪的精度問題?” —— 這可能是許多開發者在作前端程序猿的朋友們都會遇到的第一個頭疼問題。本文將深入探討前端精度問題的根源,我將以RN為例,并提供一系列實用解決方案,讓你的應用告別計算誤差。 一、精度問題的…