Mysql中存儲過程、存儲函數、自定義函數、變量、流程控制語句、光標/游標、定義條件和處理程序的使用示例

場景

存儲過程

存儲過程是一組為了完成特定功能的SQL語句集合。使用存儲過程的目的是將常用或復雜的工作預先用SQL語句寫好并用一個指定名稱存儲起來,

這個過程經編譯和優化后存儲在數據庫服務器中,因此稱為存儲過程。

當以后需要數據庫提供與己定義好的存儲過程的功能相同的服務時,只需調用"CALL 存儲過程名字"即可自動完成。

創建存儲過程

創建存儲過程需要使用 CREATE PROCEDU 語句 基本語法格式如下:

CREATE PROCEDURE sp_name ( [proc_parameter] ) [characteristic .. ·] routine body

CREATE PROCEDURE 為用來創建存儲函數的關鍵字;

sp_name為存儲過程的名稱;

proc_parameter指定存儲過程的參數列表 列表形式如下:

[ IN I OUT I INOUT ) param name type

IN 表示輸入參數, OUT 表示輸出參數, INOUT 表示既可以輸入也可以輸出 param_name 表示參數名稱 type 表示參數的類型,

該類型可以是 MySQL 數據庫中的任意類型。

characteristic 指定存儲過程的特性,有以下取值

(1)LANGUAGE SQL:說明 routine_body部分是由 SQL 語句組成的,SQL是LANGUAGE特性的唯一值。

(2)[NOT] DETERMINISTIC: 指明存儲過程執行的結果是否正確。 DETERMINISTIC表示結果是確定的,

當每次執行存儲過程時相同的的輸入會得到相同的輸出;

NOT DETERMINISTIC 表示結果是不確定的,相同的輸入可能得到不同的輸出。

如果沒有指定任意一個值,默認為NOT DETERMINISTIC。

(3){ CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }:指明子程序使用 SQL語句的限制。

CONTAINS SQL 表明子程序包含SQL語句,但是不包含讀或寫數據的語句。

NOSQL 表明子程序不包含SQL語句。

READS SQL DATA 說明子程序包含讀數據的語句。

MODIFIES SQL DATA 表明子程序包含寫數據的語句。在默認情況下,系統會指定為 CONTAINS SQL。

(4)SQL SECURITY { DEFINER |INVOKER }: 指明誰有權限來執行。 DEFINER表示只有定義者才能執行。

INVOKER 表示擁有權限的調用者可以執行。在默認情況下 系統指定為 DEFINER。

(5)COMMENT 'string': 注釋信息,可以用來描述存儲過程或函數。

routine_ body是SQL代碼的內容,可以用 BEGIN··· END 來表示 SQL 代碼的開始和結束。

創建測試表test_student

CREATE TABLE test_student
(sid int PRIMARY KEY,sname VARCHAR(20),ssex CHAR(2),sage int,did int
);

插入測試數據

INSERT INTO test_student(sid,sname,sage,did)
VALUES (1,'張三',13,101),(2,'李四',14,101),(3,'王五',15,102),(4,'趙六',16,101);

創建查看student表的存儲過程

CREATE PROCEDURE Proc_student () BEGINSELECT*FROMtest_student;
END;

調用存儲過程

CALL 語句用來調用一個使用 PROCEDURE 創建好的存儲過程,基本語法格式如下:

CALL sp name ([parameter [, ···]]}

CALL 調用語句中的 sp_name 為存儲過程的名稱, parameter 為存儲過程的參數。

創建存儲過程,查詢某個班級的平均年齡,然后調用該存儲過程

CREATE PROCEDURE avg_student (IN dep INT,OUT avg FLOAT ) BEGINSELECTavg( sage ) INTO avgFROMtest_studentWHEREdid = dep;
END;CALL avg_student(101,@aa);
-- 查詢返回的結果
SELECT @aa;

查看存儲過程

在存儲過程創建好以后,用戶可以通過如下三種方式進行查看

方式1:使用SHOW PROCEDURE STATUS 語句查看存儲過程的狀態

SHOW PROCEDURE STATUS LIKE 'avg_%';

獲取數據庫中所有名稱以字母avg_開頭的存儲過程的信息。

只能查看存儲過程操作哪一個數據庫,存儲過程的名稱、類型,誰定義的, 創建和修改時間、字符編碼等信息,

不能查看存儲過程的具體定義。

如果需要查看詳細定 ,需要使用 SHOW CREATE PROCEDURE 語句。

方式2:使用 SHOW CREATE PROCEDURE 語句

SHOW CREATE PROCEDURE avg_student;

它返回一個可用來重新創建已命名存儲過程的確切字符串

方式3:通過information_schema.Routines 查看存儲過程的信息。

SELECT * FROM information_schema.ROUTINES WHERE ROUTINE_NAME = 'avg_student';

修改存儲過程

在存儲過程創建完成后,如果需要修改,可以使用ALTER語句進行修改

修改存儲過程的定義,將讀寫權限改為MODIFIES SQL DATA,并指明調用者可以執行。

ALTER PROCEDURE avg_student
MODIFIES SQL DATA
SQL SECURITY INVOKER;

刪除存儲過程

使用DROP PROCEDURE 語句

DROP PROCEDURE avg_student;

存儲函數

創建存儲函數

創建存儲函數需要使用 CREATE FUNCTION 語旬

基本語法格式如下

CREATE FUNCTION func_name ( [func_parameter] ) RETURNS type [characteristic···] routine_ body

CREATE FUNCTION 為用來創建存儲函數的關鍵字:

func_name 表示存儲函數的名稱;

func_parameter 為存儲過程的參數列表,

參數列表形式如下

{IN | OUT | INOUT } param_name type

其中,IN 表示輸入參數,OUT 表示輸出參數,INOUT 表示既可以輸入也可以輸出, param_name 表示參數名稱,

?type 表示參數的類型,該類型可以是 MySQL 數據庫中的任意類型。

?CREATE FUNCTION name_student ( aa INT ) RETURNS CHAR ( 50 ) BEGINRETURN ( SELECT sname FROM test_student WHERE did = aa );END

參數定義 aa 返回一個CHAR類型結果。

SELECT語句從student 表申查詢 did 等于aa并將該記錄中的sname字段返回。

如果提示:

This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration and binary logging is enabled?
(you *might* want to use the less safe log_bin_trust_function_creators variable)

執行如下臨時生效,重啟后失效:

set global log_bin_trust_function_creators= TRUE;

調用存儲函數

MySQL中,存儲函數的使用方法和MySQL內部函數的使用方法是一樣的。

用戶自己定義的存儲函數與MySQL內部函數的性質相同,區別在于存儲函數是用戶自己定義的,

而內部函數是MySQL開發者定義的。

SELECT name_student(102);

查看存儲函數

可以使用 SHOW FUNCTION STATUS 語句或 SHOW CREATE FUNCTION 語句來查看

也可以直接從系統的 information_chema 數據庫中查詢。

SHOW FUNCTION STATUS LIKE 'name_student';
SHOW CREATE FUNCTION name_student;
SELECT * FROM information_schema.ROUTINES WHERE ROUTINE_NAME = 'name_student';

刪除存儲函數

刪除存儲函數可以使用 DROP FUNCTION 語句

DROP FUNCTION name_student;

自定義函數

定義變量

MySQL 中使用 DECLARE 關鍵字來定義變量,定義變量的基本語法格式如下

DECLARE var_name[,···] type [DEFAULT value]

DECLARE 關鍵字用來聲明變量。

var name 數是變量的名稱,可以同時定義多個變量。

type參數用來指定變量的類型。

DEFAULT value 子句為變量提供一個默認值。默認值可以是一個常數,也可以是一個表達式。

如果沒有給變量指定默認值,初始值為NULL

DECLARE studentid char(10) DEFAULT '一年級';

變量賦值

變量賦值使用SET語句

DECLARE v1;
SET v1=66;
-- MySQL中還可以使用SELECT··· INTO 語句為變量賦值
DECLARE student_name char(50);
SELECT sname into student_name
FROM test_student
WHERE sid= 2;

流程控制語句

IF語句

IF price>=30 thenSELECT '價格太高';
ELSE SELECT '價格適中';
END IF;

判斷price的值,如果price大于等于30,輸出字符串'價格太高',否則輸出字符串'價格適中'。

IF語句都需要END IF來結束

CASE語句用來進行條件判斷,

CASE did
WHEN 101 THEN SELECT '一年級';
WHEN 102 THEN SELECT '二年級';
END CASE;

LOOP語句

LOOP語句可以重復執行特定的語句,實現簡單的循環,但是 LOOP 語句本身并不進行條件判斷,

?沒有停止循環的語句,必須使用LEAVE語句才能停止循環,跳出循環過程。

基本格式

[begin_label:] LOOP
statement list
END LOOP [end_label]

語法中的 begin_label 參數和 end_label 參數分別表示循環開始和結束的標志,

這兩個標志必須相同 ,而且都可以省略 statement_list參數表示需要循環執行的語句

DECLARE aa int default 0;
Add_sum:loopSet aa=aa+1;
END loop Add_sum;

該例執行的是aa加1的操作,循環中沒有跳出循環的語旬,所以該循環為死循環

LEAVE語句

LEAVE 語句主要用來跳出任何被標注的流程控制語句

DECLARE aa int default 0;
Add_sum:loopSet aa=aa+1;IF aa>50 then leave Add_sum;END IF;
END loop Add_sum;

ITERATE語句

ITERATE語句也是用來跳出循環的語句,但ITERATE只可以出現在LOOP 、REPEAT和WHILE語句內。ITERATE語句是跳出本次循環,然后直接進入下次循環,ITERATE的意思是再次循環

CREATE PROCEDURE pp(a INT)
BEGINLa: LOOPSET a=a+1;
IF a<10 THEN ITERATE la;
END IF;LEAVE la;END LOOP la;SET @x=a;
END;

該例中的a變量為輸入參數,在LOOP循環中a的值加1,在 IF 條件語句中進行判斷,如果a的值小于10,則使用ITERATE la 跳出本次循環,又一次從頭開始 LOOP 循環,a的值再次加1;若a大于等于10,則ITERATE la 語句不執行 執行下面的 LEAVE la 語句跳出整個循環。

REPEAT 語句

REPEAT 語句創建的是帶條件判斷的循環過程。循環語句每次執行完都會對表達式進行判斷,若表達式為真,則結束循環,否則再次重復執行循環中的語句。當條件判斷為真時就會跳出循環語句。

REPEAT語句的基本語法格式

[begin_label:] REPEAT
statement_list
UNTIL search_condition
END REPEAT [end_label]

語法中的begin_label end_label為開始標記和結束標記 均可以省略。 statement_list 參數表示循
環的執行語旬, search_condition參數表示結束循環的條件,該條件為真時結束跳出循環 該參數為假時再次執行循環語句

DECLARE ss int DEFAULT 0;
REPEATSET ss=ss+1;UNTIL ss>=10;
END REPEAT;

WHILE 語句

WHILE 語句也是有條件控制的循環語句 WHILE 語句和REPEAT 語句是不同的。 WHILE語句在執行時先對條件表達式進行判斷 若該條件表達式為真 則執行循環內的語句,否則退出循環過程

DECLARE ss int DEFAULT 0;
WHILE ss<=10 DO
SET ss=ss+1;
END WHILE;

光標/游標的使用

在存儲過程或自定義函數中的查詢可能會返回多條記錄。

可以使用光標來逐條讀取查詢結果集中的記錄。

光標在很多其他書 被稱為游標。光標的使用包括光標的聲明、打開光標、使用光標和關閉光標。

需要注意的是,光標必須在處理程序之前聲明 在變量和條件之后聲明。

聲明光標

聲明一個名為cursor_student的光標

DECLARE cursor_student CURSOR FOR SELECT sid,sname FROM test_student;

打開光標

OPEN cursor_student;

使用光標

使用名稱為cursor_student的光標,將查詢得到的數據存儲在變量e_no e_name

FETCH cursor_student INTO e_no,e_name;

關閉光標

CLOSE cursor_student;

定義條件和處理程序

在程序的運行過程中可能會遇到問題,此時可以通過定義條件和處理程序來事先定義這些問題,

并且可以在處理程序中定義在遇到這些問題時應該采用什么樣的處理方式,提出解決方法 保證存儲過程或自

定義函數在遇到警告或錯誤時能夠繼續執行,從而增強程序處理問題的能力,避免程序出現異常,被停止執行

定義條件的語法格式

DECLARE condition_name CONDITION FOR condition_value
condition_value:
SQLSTATE [VALUE]? sqlstate_value | mysql_error_code

語法中的 condition_name 參數為條件的名稱, condition_value 參數為條件的類型。

sqlstate_value和mysql_error_code 都可以表示 MySQL 的錯誤。

其中 sqlstate_value 為長度為5的字符串類型的錯誤代碼,mysql_error_code 為數值類型錯誤代碼。

示例:定 義RROR 1110(44000)的錯誤,名稱為 command not find

DECLARE command_not_find CONDITION FOR sqlstate '44000';
DECIMAL command_not_find CONDITION FOR 1110;


定義處理程序

其語法格式如下:

DECLARE handler_type HANDLER FOR condition_value [,...] sp_statement


參數說明
handler_type : CONTINUE | EXIT | UNDO
handler_type 為錯誤處理方式,取上述3個值中的一個。

CONTINUE 表示遇到錯誤不處理,繼續執行

EXIT 表示遇到錯誤馬上退出;UNDO 表示遇到錯誤后撤銷之前的操作。

condition_value 表示錯誤的類型,該參數可以取以下值。

SQLSTATE[VALUE] sqlstate_value 字符串錯誤值。

condition_name :使用DECLARE CONDITION 定義的錯誤條件名稱。

SQLWARNING: NOT FOUND 匹配所有以 02 開頭的 SQLSTATE 錯誤代碼 SQLEXCEPTION 匹配所有沒有被SQLWARNING或NOT FOUND 捕獲的 SQLSTATE 錯誤代碼。

示例 定義捕獲 sqlstate_value 值。如果遇到 sqlstate_value 值為23SOO 執行 CONTINUE 操作,并且給變量x賦值20

DECLARE CONTINUE HANDLER FOR SQLSTATE '23S00'
SET @x= 20;

示例? 該方法捕獲 mysql_error_code 值。如果mysql_error_code值為1146,執行CONTINUE操作,并且給變量x賦值20

DECLARE CONTINUE HANDLER FOR 1146
SET @x= 20;

示例? 該方法先定義NO TABLE 條件,遇到1150錯誤時執行CONTINUE操作,并輸出"NO TABLE"信息。

DECLARE NO_TABLE CONDITION FOR 1150;
DECLARE CONTINUE HANDLER FOR NO_TABLE
SET @info= 'NO_TABLE';

示例? SQLWARNING捕獲所有以01開頭的sqlstate_value值,然后執行EXIT操作,并且輸出 "ERROR"信息。

DECLARE EXIT HANDLER FOR SQLWARNING SET @info= 'ERROR';

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

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

相關文章

分享WPF的UI開源庫

文章目錄 前言一、HandyControl二、AduSkin三、Adonis UI四、Panuon.WPF.UI五、LayUI-WPF六、MahApps.Metro七、MaterialDesignInXamlToolkit八、FluentWPF九、DMSkin總結 前言 分享WPF的UI開源庫。 一、HandyControl HandyControl是一套WPF控件庫&#xff0c;它幾乎重寫了所…

uni-app 掃描二維碼獲取信息功能

首先是掃描二維碼的功能&#xff0c;可以參考這篇博文 uni-app-H5頁面調用設備攝像頭掃描二維碼_uni-app app端調用攝像頭顯示至指定元素上顯示-CSDN博客 然后現在是可以掃描二維碼的狀態&#xff0c;掃描之后&#xff0c;可以看到首先是出發上一個頁面的事件&#xff0c;然后…

每天一個數據分析題(四百二十五)- 單因素方差分析

關于下表&#xff0c;錯誤說法是&#xff08; &#xff09; A. 這是單因素方差分析的輸出結果 B. 表中 F< F crit, 與 P-value 大于顯著性水平是等價的 C. 表內組間均方差沒有顯著大于組內均方差 D. 由于組內SS數值顯著大于組間SS&#xff0c;因此可以推斷不同分類對于…

使用Python繪制面積圖

使用Python繪制面積圖 面積圖效果代碼 面積圖 面積圖展示數據隨時間的累積變化&#xff0c;適合表現趨勢和總量。通過填充圖形下方的區域&#xff0c;可以直觀地顯示各時間點的數值及其變化。 效果 [外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-…

機器學習——決策樹(筆記)

目錄 一、認識決策樹 1. 介紹 2. 決策樹生成過程 二、sklearn中的決策樹 1. tree.DecisionTreeClassifier&#xff08;分類樹&#xff09; &#xff08;1&#xff09;模型基本參數 &#xff08;2&#xff09;模型屬性 &#xff08;3&#xff09;接口 2. tree.Decision…

最新開源免費數字人工具

使用步驟更是簡單到不行&#xff1a; 1. 輸入圖片&#xff1a;選擇你想要生成動態視頻的肖像圖片。 2. 輸入音頻&#xff1a;提供與圖片匹配的音頻文件&#xff0c;EchoMimic會根據音頻內容驅動肖像的動態效果。 3. 設置參數&#xff1a;一般保持默認設置即可&#xff0c;當然&…

排序題目:最小時間差

文章目錄 題目標題和出處難度題目描述要求示例數據范圍 解法思路和算法代碼復雜度分析 題目 標題和出處 標題&#xff1a;最小時間差 出處&#xff1a;539. 最小時間差 難度 3 級 題目描述 要求 給定一個 24 \texttt{24} 24 小時制的時間列表&#xff0c;時間以 &quo…

暗黑魅力:Xcode全面擁抱應用暗黑模式開發指南

暗黑魅力&#xff1a;Xcode全面擁抱應用暗黑模式開發指南 隨著蘋果在iOS 13和iPadOS 13中引入暗黑模式&#xff0c;用戶可以根據自己的喜好或環境光線選擇不同的界面主題。作為開發者&#xff0c;支持暗黑模式不僅能提升用戶體驗&#xff0c;還能彰顯應用的專業性。Xcode提供了…

《夢醒蝶飛:釋放Excel函數與公式的力量》11.4 ISERROR函數

第11章&#xff1a;信息函數 第四節 11.4 ISERROR函數 11.4.1 簡介 ISERROR函數是Excel中的一個信息函數&#xff0c;用于檢查指定單元格或表達式是否產生錯誤。如果單元格或表達式產生任何類型的錯誤&#xff08;如N/A、VALUE!、REF!等&#xff09;&#xff0c;則返回TRUE&…

全開源TikTok跨境商城源碼/TikTok內嵌商城+搭建教程/前端uniapp+后端

多語言跨境電商外貿商城 TikTok內嵌商城&#xff0c;商家入駐一鍵鋪貨一鍵提貨 全開源完美運營 海外版抖音TikTok商城系統源碼&#xff0c;TikToK內嵌商城&#xff0c;跨境商城系統源碼 接在tiktok里面的商城。tiktok內嵌&#xff0c;也可單獨分開出來當獨立站運營 二十一種…

FPGA原型驗證(八):如何選擇現成的原型驗證平臺?

第6章 如何選擇現成的原型驗證平臺? 在第5章中,我們探討了為基于FPGA的原型項目創建FPGA硬件平臺時應考慮的詳細因素。 現在,我們將考慮所謂的“自制還是購買”爭論的另一方面。什么時候使用現成的FPGA板或甚至是更復雜的基于FPGA的系統,而不是設計定制板更有意義? 什么…

leetcode165.解密數字

題目表述&#xff1a; 這道題目和斐波那契數列以及跳臺階問題十分相似。 斐波那契數列&#xff1a;0、1、1、2、3、5, 8、13、21、34 …… leetcode跳臺階問題&#xff1a;1、1、2、3、5, 8、13、21、34....... 這類題目的特點都是第N項的結果等于前兩項的和。 但是解密數…

java 在pdf中根據關鍵字位置插入圖片(公章、簽名等)

java 在pdf中根據關鍵字位置插入圖片&#xff08;公章、簽名等&#xff09; 1.使用依賴 <dependency><groupId>com.itextpdf</groupId><artifactId>itext7-core</artifactId><version>7.1.12</version><type>pom</type>…

【深度學習】圖形模型基礎(7):機器學習優化中的方差減少方法(1)

摘要 隨機優化是機器學習中至關重要的組成部分&#xff0c;其核心是隨機梯度下降算法&#xff08;SGD&#xff09;&#xff0c;這種方法自60多年前首次提出以來一直被廣泛使用。近八年來&#xff0c;我們見證了一個激動人心的新進展&#xff1a;隨機優化方法的方差降低技術。這…

車載測試資料學習和CANoe工具實操車載項目(每日直播)

每日直播時間&#xff1a;&#xff08;直播方式&#xff1a;騰訊會議&#xff09; 周一到周五&#xff1a;20&#xff1a;00-23&#xff1a;00 周六與周日&#xff1a;9&#xff1a;00-17&#xff1a;00 向進騰訊會議學習的&#xff0c;可以關注我并后臺留言 直播內容&#xff…

Simscape物理建模步驟

為了介紹構建和仿真物理模型的步驟&#xff0c;這里以simulink自帶示例模型Mass-Spring-Damper with Controller為例&#xff0c;下圖為建立好的模型。 詳細物理建模和仿真分析步驟如下&#xff1a; 步驟 1&#xff1a;使用 ssc_new 創建新模型 使用 ssc_new 是開始構建 Sims…

李彥宏所說的卷應用到底是什么?

李彥宏在2024世界人工智能大會上的發言強調了一個重要的觀點&#xff0c;那就是在AI時代&#xff0c;技術的應用比技術本身更為關鍵。他所提出的“卷應用”而非“卷模型”&#xff0c;實際上是在呼吁業界關注AI技術的實際落地和價值創造&#xff0c;而不是單純地在模型精度或規…

【 RESTful API 】

RESTful API 是一種用于構建 web 應用程序的設計風格和架構模式。它提供了通過 HTTP 協議訪問和操作資源的規范方式。 REST&#xff08;Representational State Transfer&#xff09;是一種軟件架構風格&#xff0c;它強調在網絡中以資源的形式進行數據傳輸和狀態管理。RESTfu…

Memcached與Redis:緩存解決方案的較量與選擇

標題&#xff1a;Memcached與Redis&#xff1a;緩存解決方案的較量與選擇 在現代應用架構中&#xff0c;緩存是提升性能的關鍵技術之一。Memcached和Redis作為兩款流行的開源緩存解決方案&#xff0c;它們各自有著獨特的特點和使用場景。本文將深入比較Memcached和Redis的特性…

案例|LabVIEW連接S7-1200PLC

附帶&#xff1a; 寫了好的參考文章&#xff1a; 通訊測試工具和博圖仿真機的連接教程【內含圖文完整過程軟件使用】 解決博圖V15 V16 V17 V18等高版本和低版本在同款PLC上不兼容的問題 目錄 前言一、準備條件二、步驟1. HslCommunicationDemo問題1&#xff1a;連接失敗?問題…