MySQL-存儲過程

介紹

基本語法

創建

調用

查看

刪除

變量

系統變量

查看

設置

用戶定義變量

賦值

使用

局部變量

聲明

賦值

流程控制

參數

條件結構

IF

case

循環結構

while

repeat

loop

游標

條件處理程序


介紹

舉個簡單的例子,我們先select某數據,然后update,再update。這一系列操作指令是在MySQL中

下達的,然后指令傳輸到應用層,那么導致的問題就是,多次的指令傳輸會涉及到網絡的請求。

所以存儲過程就是,由一系列SQL語句經過編譯后的指令集合,通過調用這個集合可以簡化開發者的流程。最重要的是,能夠減少數據在數據庫和應用服務器之間的傳輸,提高數據處理的效率。

儲存過程的思想很簡單,就是在SQL語言層面的代碼的封裝和重用。

存儲過程的特點:

  1. 封裝、復用
  2. 可以接受參數、也可以返回數據
  3. 減少網絡層的交互,提升效率

基本語法

創建

create procedure p1() --存儲過程名稱,也可以添加參數
begin--具體的SQL語句
end;

調用

call p1();

查看

  • 通過MySQL系統中的信息查看
select *from information_schema.ROUTINES where ROUTINE_SCHEMA = 'text';
--數據庫名
  • 查看創建語句
show create procedure p1;

刪除

drop procedure [if exist] p1;

注意!!!如果使用命令行執行存儲過程的創建語句,會報錯:

這是因為,在命令行中以分號為一句命令的結束,所以會導致報錯。

所以在命令行中執行創建語句時,應該使用delimiter關鍵字指定命令結束符:

delimiter $$  --指定兩個美元符號為結束符號create procedure p1() --存儲過程名稱,也可以添加參數
begin-----;
end;$$

變量

  • 系統變量

系統變量是MySQL服務器指定的,不是用戶定義的,屬于服務器層面,Global(全局變量)、Session(會話變量,只代表當前會話)

查看

show variables;
--show global variables;
--show session variables;show variables like 'ac%';
--模糊匹配select @@activate_all_roles_on_login;
--查找指定的系統變量名

設置

set session 系統變量名 = 值;
--set global 系統變量名 = 值;

注意:

  • 當沒有指定global和session時,系統默認是session會話變量
  • 當mysql重啟時沒所有設置的全局參數將會失效,要想不失效,可以在配置文件中配置

  • 用戶定義變量

賦值

set @myname = 'John';
set @myage := 10; 
--相當于定義了兩個變量,并且賦值set @mynumber = 12345 , @myaddress = '北京市';
--可以同時定義兩個用戶變量select set @mycolor := '中國紅';
--可以使用select進行賦值select count(*) into @mynum from users;
--可以使用其他表的字段來進行賦值

使用

select @mycolor,@myage;
  • 局部變量

聲明

declare user_num int;
--user_num是局部變量名

賦值

與用戶自定義變量賦值相似

流程控制

參數

create procedure p2(in score int,out ret varchar(10))
beginif score >=15 thenset ret = '優秀';elseset ret = '及格';end if;
end;call p2(18,@ret);
select @ret;

運行結果:

條件結構

  • IF

create procedure p2()
begindeclare score int default 20;declare ret varchar(10);if score >=15 thenset ret = '優秀';elseset ret = '及格';end if;select ret;
end;call p2();

還是比較好理解的,類似于編程語言中的IF語句。

  • case

create procedure p3(in month int)
begindeclare ret varchar(10);casewhen month>=1 and month<=3 thenset ret := '第一季度';when month>=4 and month<=6 thenset ret := '第二季度';when month>=7 and month<=9 thenset ret := '第三季度';when month>=10 and month<=12 thenset ret := '第四季度';else set ret := '非法參數';end case;select concat('您輸入的月份為:',month,' 所屬季度為:',ret);
end;call p3(12);

循環結構

  • while

WHILE? ?條件? ?DO

? ? ? ? SQL邏輯語句

END WHILE;

演示

輸入一個參數n,返回從1到n的累加

create procedure p4(in n int)
begindeclare total int default 0;while n>=1 doset total = total + n;set n = n - 1;end while;select total;
end;call p4(10);

運行結果

  • repeat

滿足條件退出循環

repeat

? ? ? ? SQL邏輯語句

UNTIL? ?條件

end? ?repeat;

  • loop

?loop一般配合下面兩個語句使用:

  1. LEAVE(直接退出循環)
  2. ITERATE(跳過本次循環的剩下語句,然后進入下一次循環)
create procedure p4(in n int)
begindeclare total int default 0;sum loop:if n<=0 thenleave;end if;set total = total + n;set n = n - 1;end loop sum;select total;
end;call p4(10);

游標

游標是用來存儲查詢數據集的數據類型,在存儲過程或函數過程中對結果集進行循環的處理。

  • 聲明游標

declare? 游標名? cursor? 查詢結果集;

--輸入年齡上限,將所有小于該年齡的數據的部分字段,作為一個游標create procedure p5(in n int)
begindeclare uname varchar(10);declare ugender varchar(10);declare u_cursor cursor for select user_name,user_gender from users where user_age<=n;drop table if exists u_name_gen;create table if not exists u_name_gen(id int primary key auto_increment,name varchar(10),gender varchar(10));open u_cursor;while true dofetch u_cursor into uname,ugender;insert into u_name_gen values (null,uname,ugender);end while;close u_cursor;end;call p5(32);

這里要注意的是,表確實創建成功了,但是MySQL依然會報錯:

這里的原因在于存儲過程中的循環沒有有效的停止。?

條件處理程序

條件處理程序用于在存儲過程中拋出異常時,解決問題的相應步驟。

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

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

相關文章

使用 Go 和 Gin 實現高可用負載均衡代理服務器

前言 在現代分布式系統中,負載均衡是保障服務高可用性和性能的核心技術。本文將基于 Go 語言和 Gin 框架實現一個支持動態路由、健康檢查、會話保持等特性的企業級負載均衡代理服務器,并提供完整的壓力測試方案和優化建議。 通過本方案實現的負載均衡代理具備以下優勢: 單…

在 Linux(Ubuntu / CentOS 7)上快速搭建我的世界 MineCraft 服務器,并實現遠程聯機,詳細教程

Linux 部署 MineCraft 服務器 詳細教程&#xff08;丐版&#xff0c;無需云服務器&#xff09; 一、虛擬機 Ubuntu 部署二、下載 Minecraft 服務端三、安裝 JRE 21四、安裝 MCS manager 面板五、搭建服務器六、本地測試連接七、下載櫻花&#xff0c;實現內網穿透&#xff0c;邀…

批量取消 PDF 文檔中的所有超鏈接

在 PDF 文檔中我們可以插入各種各樣的文本也可以給文本設置字體&#xff0c;顏色等多種樣式&#xff0c;同時還可以給文字或者圖片添加上超鏈接&#xff0c;當我們點擊超鏈接之后&#xff0c;就會跳轉到對應的網頁。有時候這會對我們的閱讀或者使用形成一定的干擾&#xff0c;今…

Ubuntu xinference部署本地模型bge-large-zh-v1.5、bge-reranker-v2-m3

bge-large-zh-v1.5 下載模型到指定路徑&#xff1a; modelscope download --model BAAI/bge-large-zh-v1.5 --local_dir ./bge-large-zh-v1.5自定義 embedding 模型&#xff0c;custom-bge-large-zh-v1.5.json&#xff1a; {"model_name": "custom-bge-large…

Vue的實例

Every Vue application starts with a single Vue component instance as the application root. Any other Vue component created in the same application needs to be nested inside this root component. 每個 Vue 應用都以一個 Vue 組件實例作為應用的根開始。在同一個應…

Linux學習筆記(應用篇三)

基于I.MX6ULL-MINI開發板 LED學習GPIO應用編程輸入設備 開發板中所有的設備&#xff08;對象&#xff09;都會在/sys/devices 體現出來&#xff0c;是 sysfs 文件系統中最重要的目錄結構 /sys下的子目錄說明/sys/devices這是系統中所有設備存放的目錄&#xff0c;也就是系統中…

【圖論】網絡流算法入門

&#xff08;決定狠狠加訓圖論了&#xff0c;從一直想學但沒啟動的網絡流算法開始。&#xff09; 網絡流問題 ? 問題定義&#xff1a;在帶權有向圖 G ( V , E ) G(V, E) G(V,E) 中&#xff0c;每條邊 e ( u , v ) e(u, v) e(u,v) 有容量 c ( u , v ) c(u, v) c(u,v)&am…

遞歸、搜索與回溯第四講:floodfill算法

遞歸、搜索與回溯第四講&#xff1a;floodfill算法 1.Floodfill算法介紹2.圖像渲染3.島嶼數量4.島嶼的最大面積5.被圍繞的區域6.太平洋大西洋水流問題7.掃雷游戲8.衣櫥整理 1.Floodfill算法介紹 2.圖像渲染 3.島嶼數量 4.島嶼的最大面積 5.被圍繞的區域 6.太平洋大西洋水流問題…

【深度學習與實戰】2.3、線性回歸模型與梯度下降法先導案例--最小二乘法(向量形式求解)

為了求解損失函數 對 的導數&#xff0c;并利用最小二乘法向量形式求解 的值? 這是?線性回歸?的平方誤差損失函數&#xff0c;目標是最小化預測值 與真實值 之間的差距。 ?損失函數?&#xff1a; 考慮多個樣本的情況&#xff0c;損失函數為所有樣本的平方誤差之和&a…

氣象可視化衛星云圖的方式:方法與架構詳解

氣象衛星云圖是氣象預報和氣候研究的重要數據來源。通過可視化技術,我們可以將衛星云圖數據轉化為直觀的圖像或動畫,幫助用戶更好地理解氣象變化。本文將詳細介紹衛星云圖可視化的方法、架構和代碼實現。 一、衛星云圖可視化方法 1. 數據獲取與預處理 衛星云圖數據通常來源…

瀏覽器渲染原理與優化詳解

一、瀏覽器渲染基礎原理 瀏覽器渲染流程主要包括以下步驟&#xff08;也稱為"關鍵渲染路徑"&#xff09;&#xff1a; 構建DOM樹&#xff1a;將HTML解析為DOM&#xff08;文檔對象模型&#xff09;樹構建CSSOM樹&#xff1a;將CSS解析為CSSOM&#xff08;CSS對象模…

基于Spring Boot的成績管理系統后臺實現

下面是一個完整的成績管理系統后臺實現&#xff0c;使用Spring Boot框架&#xff0c;包含學生管理、課程管理和成績管理功能。 1. 項目結構 src/main/java/com/example/grademanagement/ ├── config/ # 配置類 ├── controller/ # 控制器 ├── dto/ …

實現極限網關(INFINI Gateway)配置動態加載

還在停機更新 Gateway 配置&#xff0c;OUT 了。 今天和大家分享一個 Gateway 的功能&#xff1a;動態加載配置&#xff08;也稱熱更新或熱加載&#xff09;。 這個功能可以在 Gateway 不停機的情況下更新配置并使之生效。 配置樣例如下&#xff1a; path.data: data path.…

Mean Shift 圖像分割與 Canny 邊緣檢測教程

1. Mean Shift 簡介 Mean Shift 是一種聚類算法&#xff0c;通過尋找圖像中顏色相似的區域來實現分割。它非常適合用于場景分割或物體檢測等任務。本教程將它與 Canny 邊緣檢測結合&#xff0c;突出分割區域的邊界。 2. 圖像分割流程 我們將按照以下步驟完成圖像分割和邊緣檢…

Day15 -實例 端口掃描工具 WAF識別工具的使用

一、端口掃描工具 1、zenmap 我這里user是漢字名&#xff0c;沒有解析成功。等后續換一個英文賬戶試一試。 魔改kali的nmap nmap -p8000-9000 8.140.159.19 2、masscan cmd啟動&#xff0c;拖入exe文件。然后先寫ip&#xff0c;會報錯給提示 尋路犬系統 我們去找一下他的…

如何解決高并發場景下的性能瓶頸?實踐分享

解決高并發性能瓶頸的核心方法包括優化系統架構、合理使用緩存技術、數據庫優化及擴展策略、負載均衡設計。 其中&#xff0c;優化系統架構是根本解決性能問題的關鍵所在。良好的系統架構能夠有效支撐業務高效穩定運行&#xff0c;避免性能瓶頸帶來的損失。企業可通過微服務架構…

自動駕駛背后的數學:ReLU,Sigmoid, Leaky ReLU, PReLU,Swish等激活函數解析

隨著自動駕駛技術的飛速發展&#xff0c;深度學習在其中扮演著至關重要的角色。而激活函數作為神經網絡中的關鍵組件&#xff0c;直接影響著模型的性能和效果。前面幾篇博客 自動駕駛背后的數學&#xff1a;特征提取中的線性變換與非線性激活 , 「自動駕駛背后的數學&#xff1…

性能測試、負載測試、壓力測試的全面解析

在軟件測試領域&#xff0c;性能測試、負載測試和壓力測試是評估系統穩定性和可靠性的關鍵手段。?它們各自關注不同的測試目標和應用場景&#xff0c;理解這些差異對于制定有效的測試策略至關重要。 本文對性能測試、負載測試和壓力測試進行深入分析&#xff0c;探討其定義、…

責任鏈模式-java

1、spring依賴注入模式 @Configuration public class ChainConfig {@Beanpublic ChainSpringFactory chainSpringFactory(List<IHandler<DemoOne,Boolean>> handlerList){return new ChainSpringFactory(handlerList);}} public class DemoOne { }public abstract…

學習本地部署DeepSeek的過程(基于LM Studio)

除了使用Ollama部署DeepSeek&#xff0c;還可以使用LM Studio部署DeepSeek&#xff0c;后者是一款允許用戶在本地計算機上運行大型語言模型&#xff08;LLMs&#xff09;的桌面應用程序&#xff0c;旨在簡化本地模型的使用&#xff0c;無需云端連接或復雜配置即可體驗 AI 功能。…