Mysql的 存儲(chǔ)過(guò)程procedure及具體案例
什么是存儲(chǔ)過(guò)程
存儲(chǔ)過(guò)程(Stored Procedure)是一組為了完成特定功能的SQL語(yǔ)句集合,經(jīng)編譯后存儲(chǔ)在數(shù)據(jù)庫(kù)中,用戶(hù)通過(guò)指定存儲(chǔ)過(guò)程的名字和參數(shù)(如果有)來(lái)執(zhí)行它。存儲(chǔ)過(guò)程可以在很多數(shù)據(jù)庫(kù)管理系統(tǒng)(DBMS)中找到,如SQL Server、Oracle、MySQL等。
存儲(chǔ)過(guò)程的好處:
- 代碼重用:存儲(chǔ)過(guò)程允許你編寫(xiě)一次代碼,然后在多個(gè)地方重復(fù)使用。
- 簡(jiǎn)化操作:對(duì)于復(fù)雜的數(shù)據(jù)庫(kù)操作,可以將這些操作封裝在存儲(chǔ)過(guò)程中,用戶(hù)只需調(diào)用存儲(chǔ)過(guò)程即可。
- 提高性能:存儲(chǔ)過(guò)程在首次執(zhí)行時(shí)會(huì)進(jìn)行編譯和優(yōu)化,后續(xù)的調(diào)用會(huì)重用這些編譯后的代碼,從而提高性能。
- 安全性:通過(guò)存儲(chǔ)過(guò)程,你可以限制對(duì)基礎(chǔ)表的直接訪問(wèn),只允許通過(guò)預(yù)定義的、受控的接口進(jìn)行訪問(wèn)。
- 集中管理:所有的數(shù)據(jù)庫(kù)操作邏輯都存儲(chǔ)在數(shù)據(jù)庫(kù)中,使得管理和維護(hù)更加容易
使用存儲(chǔ)過(guò)程需要注意的是 :
1. declare語(yǔ)句只能放在存儲(chǔ)過(guò)程的開(kāi)始位置,放在后面就會(huì)報(bào)錯(cuò)
2. if 語(yǔ)句的后面必須有then,但是不需要begin,在if結(jié)束時(shí)需要end if
3. 判斷是否為NULL倒是和MSSQL一樣都有IS NULL
4. delimiter是定界符的意思在結(jié)束的end后面要添加定界符
5. end if之后必須跟分號(hào),否則語(yǔ)法錯(cuò)誤
6. while后面跟條件,條件后面要跟一個(gè)do,在while循環(huán)體結(jié)束之后需要end while并以分號(hào)結(jié)束。
7. in 表入?yún)?默認(rèn)) , out 表出參 , inout 表出入?yún)?br />8. 兩種賦值方式: set ,select into
SELECT id,data INTO x,y FROM test.t1 LIMIT 1;
SET a = 0;
具體案例:
1. 基本案例
-- 代碼 DELIMITER $$ CREATE PROCEDURE test1(IN ss VARCHAR(100)) BEGIN SELECT ss ; END $$ -- 調(diào)用 SET @s1 = '你好' ; CALL test1(@s1) ; --
2. 帶出參案例
-- 代碼
DELIMITER $$
CREATE PROCEDURE testproce(IN score INT,OUT rs VARCHAR(200))
BEGIN
DECLARE sc INT;
SET sc = score ;
IF sc < 0 OR sc > 100 THEN
SET rs = 'score error';
ELSEIF sc > 80 THEN
SET rs = 'A';
ELSEIF sc > 60 THEN
SET rs = 'B';
ELSE
SET rs = 'C';
END IF ;
END $$-- 調(diào)用 SET @a1 =60; SET @a2 = ''; CALL testproce(@a1,@a2); SELECT @a2 ; --
3.while的簡(jiǎn)單應(yīng)用
-- 代碼
DELIMITER $$
CREATE PROCEDURE proc_add_looply(IN $className VARCHAR(200),INOUT $insertTimes INT)
BEGIN
WHILE $insertTimes>0 DO
INSERT INTO classes VALUES(DEFAULT,$className);
SET $insertTimes = $insertTimes - 1 ;
END WHILE;
COMMIT;
END $$-- 調(diào)用 SET @lp_1 = '班' ; SET @lp_2 = 5 ; CALL proc_add_looply(@lp_1,@lp_2); --
4.用數(shù)據(jù)庫(kù)中的數(shù)據(jù)賦值
-- 代碼
DELIMITER $$
CREATE PROCEDURE show_job_dept(IN no2 INT,OUT job2 VARCHAR(100),OUT dno2 INT)
BEGIN
SELECT job,deptno INTO job2,dno2 FROM emp WHERE EMPNO = no2;
END $$-- 調(diào)用 SET @sjd_1 = 7369; SET @sjd_2 = ''; SET @sjd_3 = 0; CALL show_job_dept(@sjd_1,@sjd_2,@sjd_3); SELECT @sjd_2 ; SELECT @sjd_3 ; --
到此這篇關(guān)于Mysql的 存儲(chǔ)過(guò)程(procedure)的文章就介紹到這了,更多相關(guān)Mysql 存儲(chǔ)過(guò)程內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- MySQL數(shù)據(jù)庫(kù)之存儲(chǔ)過(guò)程?procedure
- mysql存儲(chǔ)過(guò)程之創(chuàng)建(CREATE PROCEDURE)和調(diào)用(CALL)及變量創(chuàng)建(DECLARE)和賦值(SET)操作方法
- 一步步教你利用Mysql存儲(chǔ)過(guò)程造百萬(wàn)級(jí)數(shù)據(jù)
- MySQL存儲(chǔ)過(guò)程的創(chuàng)建使用以及實(shí)現(xiàn)數(shù)據(jù)快速插入
- MySQL利用procedure analyse()函數(shù)優(yōu)化表結(jié)構(gòu)
相關(guān)文章
mysql索引過(guò)長(zhǎng)Specialed key was too long的解決方法
在創(chuàng)建要給表的時(shí)候遇到一個(gè)有意思的問(wèn)題,提示Specified key was too long; max key length is 767 bytes,本文就來(lái)介紹一下解決方法,如果你也遇到此類(lèi)問(wèn)題,可以參考一下2021-11-11
如何給mysql數(shù)據(jù)庫(kù)重新命名(操作步驟)
這篇文章主要介紹了如何給mysql數(shù)據(jù)庫(kù)重新命名,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-05-05
MySQL如何快速創(chuàng)建800w條測(cè)試數(shù)據(jù)表
這篇文章主要介紹了MySQL如何快速創(chuàng)建800w條測(cè)試數(shù)據(jù)表,下面文章圍繞MySQL創(chuàng)建測(cè)試數(shù)據(jù)表的相關(guān)資料展開(kāi)詳細(xì)內(nèi)容,具有一的的參考價(jià)值,需要的小伙伴可以參考一下2022-03-03
MySQL函數(shù)講解(MySQL函數(shù)大全)
MySQL函數(shù)大全和函數(shù)講解,管理MYSQL數(shù)據(jù)一定會(huì)用到2013-11-11
homeassistant數(shù)據(jù)存儲(chǔ)到mysql數(shù)據(jù)庫(kù)方式
這篇文章主要介紹了homeassistant數(shù)據(jù)存儲(chǔ)到mysql數(shù)據(jù)庫(kù)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-12-12
MySQL數(shù)據(jù)庫(kù)通過(guò)Binlog恢復(fù)數(shù)據(jù)的詳細(xì)步驟
MySQL的binlog日志是MySQL日志中非常重要的一種日志,記錄了數(shù)據(jù)庫(kù)所有的DML操作,下面這篇文章主要給大家介紹了關(guān)于MySQL數(shù)據(jù)庫(kù)通過(guò)Binlog恢復(fù)數(shù)據(jù)的相關(guān)資料,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下2022-06-06

