Mysql的 存儲(chǔ)過程procedure及具體案例
什么是存儲(chǔ)過程
存儲(chǔ)過程(Stored Procedure)是一組為了完成特定功能的SQL語句集合,經(jīng)編譯后存儲(chǔ)在數(shù)據(jù)庫中,用戶通過指定存儲(chǔ)過程的名字和參數(shù)(如果有)來執(zhí)行它。存儲(chǔ)過程可以在很多數(shù)據(jù)庫管理系統(tǒng)(DBMS)中找到,如SQL Server、Oracle、MySQL等。
存儲(chǔ)過程的好處:
- 代碼重用:存儲(chǔ)過程允許你編寫一次代碼,然后在多個(gè)地方重復(fù)使用。
- 簡化操作:對于復(fù)雜的數(shù)據(jù)庫操作,可以將這些操作封裝在存儲(chǔ)過程中,用戶只需調(diào)用存儲(chǔ)過程即可。
- 提高性能:存儲(chǔ)過程在首次執(zhí)行時(shí)會(huì)進(jìn)行編譯和優(yōu)化,后續(xù)的調(diào)用會(huì)重用這些編譯后的代碼,從而提高性能。
- 安全性:通過存儲(chǔ)過程,你可以限制對基礎(chǔ)表的直接訪問,只允許通過預(yù)定義的、受控的接口進(jìn)行訪問。
- 集中管理:所有的數(shù)據(jù)庫操作邏輯都存儲(chǔ)在數(shù)據(jù)庫中,使得管理和維護(hù)更加容易
使用存儲(chǔ)過程需要注意的是 :
1. declare語句只能放在存儲(chǔ)過程的開始位置,放在后面就會(huì)報(bào)錯(cuò)
2. if 語句的后面必須有then,但是不需要begin,在if結(jié)束時(shí)需要end if
3. 判斷是否為NULL倒是和MSSQL一樣都有IS NULL
4. delimiter是定界符的意思在結(jié)束的end后面要添加定界符
5. end if之后必須跟分號,否則語法錯(cuò)誤
6. while后面跟條件,條件后面要跟一個(gè)do,在while循環(huán)體結(jié)束之后需要end while并以分號結(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的簡單應(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ù)庫中的數(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ǔ)過程(procedure)的文章就介紹到這了,更多相關(guān)Mysql 存儲(chǔ)過程內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
mysql數(shù)據(jù)庫添加用戶及分配權(quán)限具體實(shí)現(xiàn)
這篇文章主要介紹了mysql數(shù)據(jù)庫添加用戶及分配權(quán)限的方法,需要的朋友可以參考下2014-02-02
MySQL關(guān)于sql_mode解析與設(shè)置講解
今天小編就為大家分享一篇關(guān)于MySQL關(guān)于sql_mode解析與設(shè)置講解,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2019-03-03
CentOS6.9下mysql 5.7.17安裝配置方法圖文教程
這篇文章主要為大家詳細(xì)介紹了CentOS6.9下mysql 5.7.17安裝配置方法圖文教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-10-10
mysqld_multi在Linux服務(wù)器上運(yùn)行多個(gè)MySQL實(shí)例
在Linux系統(tǒng)上使用mysqld_multi來啟動(dòng)和管理多個(gè)MySQL實(shí)例是一種常見的做法,這種方式允許你在同一臺機(jī)器上運(yùn)行多個(gè)MySQL服務(wù),每個(gè)服務(wù)可以有不同的配置和數(shù)據(jù)目錄,這篇文章展示如何設(shè)置和使用mysqld_multi來啟動(dòng)多個(gè)MySQL實(shí)例2025-02-02
MySQL中表復(fù)制:create table like 與 create table as select
這篇文章主要介紹了MySQL中表復(fù)制:create table like 與 create table as select,需要的朋友可以參考下2014-12-12
MySQL 導(dǎo)出數(shù)據(jù)為csv格式的方法
這篇文章主要介紹了MySQL 導(dǎo)出數(shù)據(jù)為csv格式的方法,需要的朋友可以參考下2015-10-10
CentOS7.3下mysql 8.0.13安裝配置方法圖文教程
這篇文章主要為大家詳細(xì)介紹了CentOS7.3下mysql 8.0.13安裝配置方法圖文教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-11-11
MySQL中REPLACE INTO和INSERT INTO的區(qū)別分析
REPLACE的運(yùn)行與INSERT很相似。只有一點(diǎn)例外,假如表中的一個(gè)舊記錄與一個(gè)用于PRIMARY KEY或一個(gè)UNIQUE索引的新記錄具有相同的值,則在新記錄被插入之前,舊記錄被刪除。2011-07-07
MySQL數(shù)據(jù)庫實(shí)現(xiàn)高可用架構(gòu)之MHA的實(shí)戰(zhàn)
本文主要介紹了MySQL數(shù)據(jù)庫實(shí)現(xiàn)高可用架構(gòu)之MHA的實(shí)戰(zhàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-02-02
MySQL實(shí)現(xiàn)批量插入測試數(shù)據(jù)的方式總結(jié)
在開發(fā)過程中經(jīng)常需要一些測試數(shù)據(jù),?這個(gè)時(shí)候如果手敲的話,?十行二十行還好,?多了就很死亡了,?接下來介紹兩種常用的MySQL測試數(shù)據(jù)批量生成方式,希望對大家有所幫助2023-05-05

