Mysql(存儲過程)

目錄

介紹

特點

存儲過程創建

系統變量(不重要)

用戶變量

局部變量

?if 判斷

參數(in, out, inout)

case

?while

repeat

?loop

游標和條件處理程序-handler

存儲函數


為了防止以后忘記,反復去看視頻浪費時間,特寫一篇

介紹

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

特點

封裝,復用
可以接收參數,也可以返回數據
減少網絡交互,效率提升

存儲過程創建

--存儲過程創建
CREATE PROCEDURE 存儲過程名(參數列表)
BEGIN--sql語句
END;--調用
CALL 名稱([參數])--查看存儲過程創建語句
show create procedure 存儲過程名--刪除存儲過程
DROP PROCEDURE [IF EXISTS]存儲過程名稱;

例子

-- 存儲過程基本語法
-- 創建
create procedure p1()
beginselect count(*)from student;
end;-- 調用
call p1();-- 查看
select * from information_schema.ROUTINES where ROUTINE_SCHEMA = 'itcast';--方式1show create procedure p1;----方式2-- 刪除
drop procedure if exists p1;

系統變量(不重要)

?(默認session)[不要求掌握,了解即可,我是感覺這個沒吊用]

--查看所有系統變量
SHOW [SESSION |GLOBAL] VARIABLES ; --可以通過LKE模糊匹配方式查找變量
SHOW [SESSION|GLOBAL] VARIABLES LIKE'。。'; -- 查看指定變量的值
SELECT @@[SESSION|GLOBAL].系統變量名; 設置系統變量
SET [SESSION|GLOBAL] 系統變量名 = 值
SET @@[SESSION|GLOBAL] 系統變量名 = 值

例子

查看系統變量

show session variablesshow global variables

結果:(有一堆)

show session variables like 'auto%'

結果:?

?設置會話系統變量

select @@session.autocommit --自動提交默認開啟,結果為1
set session autocommit = 0 --設置關閉
select @@session.autocommit -- 結果為0

注意,會話系統變量僅對當前查詢控制臺有效,當你打開另一個查詢控制臺,再次查詢,會發現autocommit的結果依然為1,要想對所有查詢控制臺有效,需要把session改為global,但是如果你設置global.autocommit = 0,將mysql重啟,autocommit結果依然為1,如果你想設置重啟服務器autocommit也為0,需要將autocommit = 0寫入mysql的配置文件才可以。

對了,如果你設置autocommit = 0,當你執行sql語句時必須還要執行commit,這樣sql才會生效。(但是,我實驗的,設置為0,也自動提交有效)

用戶變量

賦值:SET @var_name = expr [, @var_name = expr]...;
SET @var_name := expr [, @var_name := expr]...;-- 推薦SELECT @var_name := expr , @var_name := expr ...;
SELECT 字段名 INTO @var_name FROM 表名;使用:SELECT @var_name;

例子

-- 變量:用戶變量
-- 賦值
set @myname = 'root';
set @myage := 10;select @mycolor := 'red';
select count(*) into @mycount from tb_user;-- 使用
select @myname, @myage, @mycolor, @mycount;select @abc; -- 輸出為NULL

?

局部變量

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

聲明:

DECLARE 變量名 變量類型 [DEFAULT..];

變量類型就是數據庫字段類型:INT、BIGINT、CHAR、VARCHAR、DATE、TIME等。

賦值:

SET 變量名=值;

SET 變量名:=值;

SELECT 字段名 INTO 變量名 FROM 表名 ...;

例子

-- 變量:局部變量
-- 聲明 - declare
-- 賦值 -
create procedure p2()
begindeclare stu_count int default 0;select count(*) into stu_count from student;select stu_count;
end;call p2();

?if 判斷

語法

IF 條件1 THEN...
ELSEIF 條件2 THEN -- 可選...
ELSE              -- 可選...
END IF;

例子

create procedure p3()
begindeclare score int default 58;declare result varchar(10);if score >= 85 thenset result :='優秀';elseif score >= 60 thenset result :='及格';elseset result :='不及格';end if;select result;
end;

參數(in, out, inout)

類型含義備注
IN該類參數作為輸入,也就是需要調用時傳入值默認
OUT該類參數作為輸出,也就是該參數可以作為返回值
INOUT既可以作為輸入參數,也可以作為輸出參數****

?用法

CREATE PROCEDURE 存儲過程名稱([IN/OUT/INOUT 參數名 參數類型 ])
BEGIN-- SQL語句
END :

例子

-- 根據傳入(in)參數score,判定當前分數對應的分數等級,并返回(out)
-- score >= 85分,等級為優秀。
-- score >= 60分 且 score < 85分,等級為及格
-- score < 60分,等級為不及格。
create procedure p3(in score int, out result varchar(10))
beginif score >= 85 thenset result :='優秀';elseif score >= 60 thenset result :='及格';elseset result :='不及格';end if;select result;
end;-- 將傳入的200分制的分數,進行換算,換算成百分制,然后返回分數 --> inout
create procedure p5(inout score double)
beginset score := score * 0.5;
end;set @score = 198;
call p5(score);
select @score;

case

例子?

-- case
-- 根據傳入的月份,判定月份所屬的季節(要求采用case結構)
-- 1-3月份,為第一季度
-- 4-6月份,為第二季度
-- 7-9月份,為第三季度
-- 10-12月份,為第四季度create procedure p6(in month int)
begin declare result varchar(10);case when 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 := '第四季度';elseset result := '非法參數';end case;select concat('你輸入的月份為:', month, ',所屬季度為:', result);
end;

?while

語法

#先判定條件,如果條件為true,則執行邏輯,否則,不執行邏輯
WHILE 條件 DOSOL邏輯...
END WHILE;

?例子

-- while計算從1累加到 n 的值,n 為傳入的參數值。
-- A.定義局部變量,記錄累加之后的值;
-- B.每循環一次,就會對 n 進行減1,如果 n 減到0,則退出循環create procedure p7(in n int)
begindeclare total int default 0;while n>0 doset total := total + nset n:=n-1;end while;select total;
end;
call p7( n: 100);

repeat

語法

#repeat是有條件的循環控制語句,當滿足條件的時候退出循環。相當于 c 語言中的 do while();
REPEATSOL邏輯.UNTIL 條件
END REPEAT;

例子?

-- while計算從1累加到 n 的值,n 為傳入的參數值。
-- A.定義局部變量,記錄累加之后的值;
-- B.每循環一次,就會對 n 進行減1,如果 n 減到0,則退出循環create procedure p8(innint)
begindeclare total int default 0;repeatset total := total + n;set n := n - 1;until n <= 0end repeat;select total;
end;call p8( n: 10);
call p8( n: 100);

?loop

?LOOP 實現簡單的循環,如果不在SQL邏輯中增加退出循環的條件,可以用其來實現簡單的死循環。

LOOP可以配合一下兩個語句使用。

LEAVE:配合循環使用,退出循環。
ITERATE:必須用在循環中,作用是跳過當前循環剩下的語句,直接進入下一次循環。

語法

[begin label:] LOOPSQL邏輯..
END LOOP [end label];LEAVE label; ?-- 退出指定標記的循環體
ITERATE label;-- 直接進入下一次循環

?例子

-- loop 計算從1到n之間的偶數累加的值,n為傳入的參數值。
-- A.定義局部變量,記錄累加之后的值;
-- B.每循環一次,就會勸進行-1,如果n減到0,則退出循環。------> leave xx
-- C.如果當次累加的數據是奇數,則直接進入下一次循壞。-------> iterate xxcreate procedure p10(in n int)
begin declare total int defatult 0;sum: loopif n <= 0 thenleave sum;    #如果加完就退出loopend 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;

游標和條件處理程序-handler

游標語法(指向表的行數據,常用于行數據賦值)

--聲明游標
DECLARE 游標名稱 CURSOR FOR 查詢語句;!!!游標聲明要在局部變量聲明后--打開游標:
OPEN 游標名稱;--獲取游標記錄:
FETCH 游標名稱 INTO 變量[,變量];--關閉游標:
CLOSE 游標名稱;

?條件處理程序語法

DECLARE handler_action HANDLERFOR condition_value [,condition_value]... statement;handler_action,可以取以下值:CONTINUE: 繼續執行當前程序EXIT: 終止執行當前程序
condition_value,可以取以下值SOLSTATE sqlstate_value:狀態碼,如 02000SQLWARNING:所有以01開頭的SQLSTATE代碼的簡寫NOT FOUND:所有以02開頭的SOLSTATE代碼的簡寫SOLEXCEPTION:所有沒有被SOLWARNING 或 NOT FOUND捕獲的SOLSTATE代碼的簡寫

例子

create procedure p11(in uage int)
begin declare uname varchar(100);declare upro varchar(100);declare u_cursor cursor for select name, profession from tb_user where age <= uage;-- 監控到02000(表示找不到行)的狀態碼后,關閉游標后執行exit退出操作。declare exit handler for sqlstate '02000' close u_cursor; --declare exit handler for not found close u_cursor; drop table if exists tb_user_pro;create table if not exists tb_user_pro(id int primary key auto_increment,name varchar(100),profession varchar(100));open u_cursor;while true dofetch u_cursor into uname,upro;insert into tb_user_pro values(null, uname, upro);end while;close u_cursor;
end;

存儲函數

存儲函數是有返回值的存儲過程,存儲函數的參數只能是IN類型的。

存儲函數用的較少,能夠使用存儲函數的地方都可以用存儲過程替換。

語法

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

?例子

create function fun1(n int)
returns int deterministic
begindeclare total int default 0;while n > 0 do set total := total + n;set n := n - 1;end while;return total;
end;

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

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

相關文章

Effective Python 第14條: 用sort方法的key參數來表示復雜的排序邏輯

一、引言&#xff1a;Python排序功能的重要性 在Python開發中&#xff0c;排序功能是一個常見的需求。無論是處理數據、優化算法&#xff0c;還是提升用戶體驗&#xff0c;排序都是不可或缺的一部分。Python的列表內置了sort方法&#xff0c;提供了靈活的排序功能。然而&#…

react+antd 可拖拽模態框組件

DraggableModal 可拖拽模態框組件使用說明 概述 DraggableModal 是一個基于 dnd-kit/core 實現的可拖拽模態框組件&#xff0c;允許用戶通過拖拽標題欄來移動模態框位置。該組件具有智能邊界檢測功能&#xff0c;確保模態框始終保持在可視區域內。 功能特性 ? 可拖拽移動&…

MySQL的基本操作及相關python代碼

下面為你介紹 MySQL 的基本操作,以及對應的 Python 代碼實現。我會先介紹 SQL 基本操作,再展示如何用 Python 連接 MySQL 并執行這些操作。 一、MySQL 基本操作(SQL 語句) 1. 連接數據庫 bash mysql -u root -p2. 創建數據庫 sql CREATE DATABASE testdb;3. 使用數據…

Armbian(斐訊N1)安裝xfce桌面以及遠程環境

安裝xfce桌面以及vncserver(遠程連接) 安裝xfce桌面 apt-get install xfce4 xfce4-goodies xorg dbus-x11 x11-xserver-utils ubuntu的安裝gdm3&#xff0c; apt install gdm3 debian安裝lightdm。 apt install lightdm 安裝vnc server apt-get install tightvncserver 中文字體…

【Oracle】Oracle 11g打補丁時遇到opatch apply命令無法識別

?? 1. 使用完整路徑執行命令 問題原因&#xff1a;若未將$ORACLE_HOME/OPatch加入系統PATH環境變量&#xff0c;直接輸入opatch apply會因系統無法定位命令而報錯。 解決方案&#xff1a; 改用絕對路徑執行&#xff1a; $ORACLE_HOME/OPatch/opatch apply例如&#xff1a; /u…

單例模式詳細講解

一.定義單例模式是一種創建型設計模式&#xff0c;確保一個類只有一個實例&#xff0c;并提供一個全局訪問點特點&#xff1a;1.構造函數和析構函數私有化2.禁用拷貝構造函數和賦值運算符重載&#xff08;delete&#xff09;3.利用靜態成員函數和靜態成員變量來給外界提供訪問二…

KORGym:評估大語言模型推理能力的動態游戲平臺

KORGym&#xff1a;評估大語言模型推理能力的動態游戲平臺 現有評估基準多受領域限制或 pretraining 數據影響&#xff0c;難以精準測LLMs內在推理能力。KORGym平臺應運而生&#xff0c;含50余款游戲&#xff0c;多維度評估&#xff0c;本文將深入解析其設計、框架、實驗及發現…

ISPDiffuser文章翻譯理解

ISPDiffuser: Learning RAW-to-sRGB Mappings with Texture-Aware Diffusion Models and Histogram-Guided Color Consistency翻譯 Type: Conference paper Author: Yang Ren1,4, Hai Jiang1,4, Menglong Yang1,2,?, Wei Li1,2, Shuaicheng Liu3,4,? Select: ???????…

C++線程池執行步驟分析,總結線程池流程

線程池流程總結&#xff1a;1、構造函數中創建線程&#xff0c;并添加到線程池&#xff08;構造函數返回時&#xff0c;線程自動啟動&#xff0c;并停在等待wait&#xff1a;從線程池取出一個任務處&#xff09;&#xff1b; 2、主線程中添加任務&#xff0c;到任務隊列。并用“…

Java 通過 HttpURLConnection發送 http 請求

問題&#xff1a; 在調試 kill 接口的時候&#xff0c;對方的服務用的是 Django RestFramework 框架提供的接口&#xff0c;用 python 請求時得到的內容如下&#xff1a; ? ~ python3 test.py <Response [200]> "true" // 對應的代碼是 print(response, r…

【PTA數據結構 | C語言版】列出連通集

本專欄持續輸出數據結構題目集&#xff0c;歡迎訂閱。 文章目錄題目代碼題目 給定一個有 n 個頂點和 m 條邊的無向圖&#xff0c;請用深度優先遍歷&#xff08;DFS&#xff09;和廣度優先遍歷&#xff08;BFS&#xff09;分別列出其所有的連通集。假設頂點從 0 到 n?1 編號。…

GoLang教程005:switch分支

3.4 Switch分支 在 GoLand&#xff08;其實是 JetBrains 開發的 Go 編程語言 IDE&#xff09;中&#xff0c;switch 是 Go 語言&#xff08;Golang&#xff09; 的一個重要控制結構&#xff0c;用于替代多個 if-else 語句。 ? 特點說明特性說明自動 breakGo 的 switch 語句默認…

uniapp相關地圖 API調用

目錄 一、 注意事項&#xff1a; manifest.json需增加配置 二、獲取用戶收貨地址 [uni.chooseAddress] 三、獲取當前的地理位置、速度 [uni.getLocation] 四、打開地圖選擇位置、查看位置(導航) [uni.chooseLocation] [uni.openLocation] 五、使用騰訊地圖逆地址解析接口實…

Java學習----NIO模型

在 Java 的 I/O 模型中&#xff0c;NIO&#xff08;Non - Blocking I/O&#xff0c;非阻塞 I/O&#xff09;是對 BIO 的重要改進。它為高并發場景提供了更高效的處理方式&#xff0c;在眾多 Java 應用中發揮著關鍵作用。NIO模型的核心在于非阻塞和多路復用&#xff0c;其采用 “…

MySQL計數函數count原理分析

前言 統計表中數據的條數是非常常用的操作,但是咱們常用的InnoDB存儲引擎計數函數是現時統計的,所以會出現性能的問題,這次我準備分享計數函數count的原理,保證之后遇到計數方面的問題都可以輕易靈活的解決 與MyISAM存儲引擎相比,MyISAM存儲引擎是自己記錄了表中數據的條數,但…

Day07_網絡編程20250721_大項目

基本代碼&#xff1a;搭建服務器客戶端&#xff0c;要求服務器使用 epoll 模型客戶端使用多線程服務器打開數據庫&#xff0c;表單格式如下name text primary key pswd text not null客戶端做一個簡單的界面&#xff1a;1&#xff1a;注冊2&#xff1a;登錄無論注冊還是登錄&am…

20250721

P5357 【模板】AC 自動機 - 洛谷 主要是構建fail樹 /* 我們可以知道的是&#xff0c;當訪問一個點x時&#xff0c;接下來需要跳轉其fail[x]&#xff0c;以此類推&#xff0c;如果在某個fail[x]上出現了一個字符串&#xff0c;那么相應的統計次數應該加1&#xff0c;然后當訪…

【INT四則優先算式】2022-9-22

緣由ccf201903-2二十四點我用暴力破解做的&#xff0c;但是兩個程序一個拿到了滿分&#xff0c;一個拿到了50分&#xff0c;看了很長時間也沒看出問題在哪里&#xff0c;希望有英雄慧眼幫我看一下-編程語言-CSDN問答 void INT四則優先算式() {//緣由https://ask.csdn.net/ques…

本地k8s集群的搭建

windows機器&#xff0c;考慮如果使用云服務器&#xff0c;每年的開銷還是太大&#xff0c;不值得&#xff0c;自己只是做demo&#xff0c;了解各種配置和使用即可&#xff0c;使用VMware的虛擬機來搭建k8s集群 使用docker安裝rancher和k8s yum -y install chronycat > /et…

B樹、B+樹的區別及MySQL為何選擇B+樹

B樹與B樹 B樹和B樹都是自平衡的多路搜索樹&#xff0c;廣泛應用于數據庫和文件系統中&#xff0c;用于高效管理大量數據。它們的設計目標是在磁盤存儲環境下減少I/O操作次數&#xff0c;提高數據訪問效率。下面我將逐步解釋兩者的定義、特性、比較以及應用場景&#xff0c;確保…