国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

玩轉(zhuǎn)Mysql系列 - 第17篇:存儲過程&自定義函數(shù)詳解

這篇具有很好參考價值的文章主要介紹了玩轉(zhuǎn)Mysql系列 - 第17篇:存儲過程&自定義函數(shù)詳解。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報違法"按鈕提交疑問。

這是Mysql系列第17篇。

環(huán)境:mysql5.7.25,cmd命令中進(jìn)行演示。

代碼中被[]包含的表示可選,|符號分開的表示可選其一。

需求背景介紹

線上程序有時候出現(xiàn)問題導(dǎo)致數(shù)據(jù)錯誤的時候,如果比較緊急,我們可以寫一個存儲來快速修復(fù)這塊的數(shù)據(jù),然后再去修復(fù)程序,這種方式我們用到過不少。

存儲過程相對于java程序?qū)τ趈ava開發(fā)來說,可能并不是太好維護(hù)以及閱讀,所以不建議在程序中去調(diào)用存儲過程做一些業(yè)務(wù)操作。

關(guān)于自定義函數(shù)這塊,若mysql內(nèi)部自帶的一些函數(shù)無法滿足我們的需求的時候,我們可以自己開發(fā)一些自定義函數(shù)來使用。

所以建議大家掌握mysql中存儲過程和自定義函數(shù)這塊的內(nèi)容。

本文內(nèi)容

  • 詳解存儲過程的使用

  • 詳解自定義函數(shù)的使用

準(zhǔn)備數(shù)據(jù)

/*建庫javacode2018*/
drop?database?if?exists?javacode2018;
create?database?javacode2018;

/*切換到j(luò)avacode2018庫*/
use?javacode2018;

/*建表test1*/
DROP?TABLE?IF?EXISTS?t_user;
CREATE?TABLE?t_user?(
??id???INT?NOT?NULL?PRIMARY?KEY?COMMENT?'編號',
??age??SMALLINT?UNSIGNED?NOT?NULL?COMMENT?'年齡',
??name?VARCHAR(16)?NOT?NULL?COMMENT?'姓名'
)?COMMENT?'用戶表';

存儲過程

概念

一組預(yù)編譯好的sql語句集合,理解成批處理語句。

好處:

  • 提高代碼的重用性

  • 簡化操作

  • 減少編譯次數(shù)并且減少和數(shù)據(jù)庫服務(wù)器連接的次數(shù),提高了效率。

創(chuàng)建存儲過程
create?procedure?存儲過程名([參數(shù)模式]?參數(shù)名?參數(shù)類型)
begin
????存儲過程體
end

參數(shù)模式有3種:

in:該參數(shù)可以作為輸入,也就是該參數(shù)需要調(diào)用方傳入值。

out:該參數(shù)可以作為輸出,也就是說該參數(shù)可以作為返回值。

inout:該參數(shù)既可以作為輸入也可以作為輸出,也就是說該參數(shù)需要在調(diào)用的時候傳入值,又可以作為返回值。

參數(shù)模式默認(rèn)為IN。

一個存儲過程可以有多個輸入、多個輸出、多個輸入輸出參數(shù)。

調(diào)用存儲過程
call?存儲過程名稱(參數(shù)列表);

注意:調(diào)用存儲過程關(guān)鍵字是call。

刪除存儲過程
drop?procedure?[if?exists]?存儲過程名稱;

存儲過程只能一個個刪除,不能批量刪除。

if exists:表示存儲過程存在的情況下刪除。

修改存儲過程

存儲過程不能修改,若涉及到修改的,可以先刪除,然后重建。

查看存儲過程
show?create?procedure?存儲過程名稱;

可以查看存儲過程詳細(xì)創(chuàng)建語句。

示例
示例1:空參列表

創(chuàng)建存儲過程

/*設(shè)置結(jié)束符為$*/
DELIMITER?$
/*如果存儲過程存在則刪除*/
DROP?PROCEDURE?IF?EXISTS?proc1;
/*創(chuàng)建存儲過程proc1*/
CREATE?PROCEDURE?proc1()
??BEGIN
????INSERT?INTO?t_user?VALUES?(1,30,'路人甲Java');
????INSERT?INTO?t_user?VALUES?(2,50,'劉德華');
??END?$

/*將結(jié)束符置為;*/
DELIMITER?;

delimiter用來設(shè)置結(jié)束符,當(dāng)mysql執(zhí)行腳本的時候,遇到結(jié)束符的時候,會把結(jié)束符前面的所有語句作為一個整體運(yùn)行,存儲過程中的腳本有多個sql,但是需要作為一個整體運(yùn)行,所以此處用到了delimiter。

mysql默認(rèn)結(jié)束符是分號。

上面存儲過程中向t_user表中插入了2條數(shù)據(jù)。

調(diào)用存儲過程:

CALL?proc1();

驗證效果:

mysql>?select?*?from?t_user;
+----+-----+---------------+
|?id?|?age?|?name??????????|
+----+-----+---------------+
|??1?|??30?|?路人甲Java????|
|??2?|??50?|?劉德華????????|
+----+-----+---------------+
2?rows?in?set?(0.00?sec)

存儲過程調(diào)用成功,test1表成功插入了2條數(shù)據(jù)。

示例2:帶in參數(shù)的存儲過程

創(chuàng)建存儲過程:

/*設(shè)置結(jié)束符為$*/
DELIMITER?$
/*如果存儲過程存在則刪除*/
DROP?PROCEDURE?IF?EXISTS?proc2;
/*創(chuàng)建存儲過程proc2*/
CREATE?PROCEDURE?proc2(id?int,age?int,in?name?varchar(16))
??BEGIN
????INSERT?INTO?t_user?VALUES?(id,age,name);
??END?$

/*將結(jié)束符置為;*/
DELIMITER?;

調(diào)用存儲過程:

/*創(chuàng)建了3個自定義變量*/
SELECT?@id:=3,@age:=56,@name:='張學(xué)友';
/*調(diào)用存儲過程*/
CALL?proc2(@id,@age,@name);

驗證效果:

mysql>?select?*?from?t_user;
+----+-----+---------------+
|?id?|?age?|?name??????????|
+----+-----+---------------+
|??1?|??30?|?路人甲Java????|
|??2?|??50?|?劉德華????????|
|??3?|??56?|?張學(xué)友????????|
+----+-----+---------------+
3?rows?in?set?(0.00?sec)

張學(xué)友插入成功。

示例3:帶out參數(shù)的存儲過程

創(chuàng)建存儲過程:

delete?a?from?t_user?a?where?a.id?=?4;
/*如果存儲過程存在則刪除*/
DROP?PROCEDURE?IF?EXISTS?proc3;
/*設(shè)置結(jié)束符為$*/
DELIMITER?$
/*創(chuàng)建存儲過程proc3*/
CREATE?PROCEDURE?proc3(id?int,age?int,in?name?varchar(16),out?user_count?int,out?max_id?INT)
??BEGIN
????INSERT?INTO?t_user?VALUES?(id,age,name);
????/*查詢出t_user表的記錄,放入user_count中,max_id用來存儲t_user中最小的id*/
????SELECT?COUNT(*),max(id)?into?user_count,max_id?from?t_user;
??END?$

/*將結(jié)束符置為;*/
DELIMITER?;

proc3中前2個參數(shù),沒有指定參數(shù)模式,默認(rèn)為in。

調(diào)用存儲過程:

/*創(chuàng)建了3個自定義變量*/
SELECT?@id:=4,@age:=55,@name:='郭富城';
/*調(diào)用存儲過程*/
CALL?proc3(@id,@age,@name,@user_count,@max_id);

驗證效果:

mysql>?select?@user_count,@max_id;
+-------------+---------+
|?@user_count?|?@max_id?|
+-------------+---------+
|???????????4?|???????4?|
+-------------+---------+
1?row?in?set?(0.00?sec)
示例4:帶inout參數(shù)的存儲過程

創(chuàng)建存儲過程:

/*如果存儲過程存在則刪除*/
DROP?PROCEDURE?IF?EXISTS?proc4;
/*設(shè)置結(jié)束符為$*/
DELIMITER?$
/*創(chuàng)建存儲過程proc4*/
CREATE?PROCEDURE?proc4(INOUT?a?int,INOUT?b?int)
??BEGIN
????SET?a?=?a*2;
????select?b*2?into?b;
??END?$

/*將結(jié)束符置為;*/
DELIMITER?;

調(diào)用存儲過程:

/*創(chuàng)建了2個自定義變量*/
set?@a=10,@b:=20;
/*調(diào)用存儲過程*/
CALL?proc4(@a,@b);

驗證效果:

mysql>?SELECT?@a,@b;
+------+------+
|?@a???|?@b???|
+------+------+
|???20?|???40?|
+------+------+
1?row?in?set?(0.00?sec)

上面的兩個自定義變量@a、@b作為入?yún)?,然后在存儲過程內(nèi)部進(jìn)行了修改,又作為了返回值。

示例5:查看存儲過程
mysql>?show?create?procedure?proc4;
+-------+-------+-------+-------+-------+-------+
|?Procedure?|?sql_mode?|?Create?Procedure?|?character_set_client?|?collation_connection?|?Database?Collation?|
+-------+-------+-------+-------+-------+-------+
|?proc4?????|?ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION?|?CREATE?DEFINER=`root`@`localhost`?PROCEDURE?`proc4`(INOUT?a?int,INOUT?b?int)
BEGIN
????SET?a?=?a*2;
????select?b*2?into?b;
??END?|?utf8?????????????????|?utf8_general_ci??????|?utf8_general_ci????|
+-------+-------+-------+-------+-------+-------+
1?row?in?set?(0.00?sec)

函數(shù)

概念

一組預(yù)編譯好的sql語句集合,理解成批處理語句。類似于java中的方法,但是必須有返回值。

創(chuàng)建函數(shù)
create?function?函數(shù)名(參數(shù)名稱?參數(shù)類型)
returns?返回值類型
begin
????函數(shù)體
end

參數(shù)是可選的。

返回值是必須的。

調(diào)用函數(shù)
select?函數(shù)名(實參列表);
刪除函數(shù)
drop?function?[if?exists]?函數(shù)名;
查看函數(shù)詳細(xì)
show?create?function?函數(shù)名;
示例
示例1:無參函數(shù)

創(chuàng)建函數(shù):

/*刪除fun1*/
DROP?FUNCTION?IF?EXISTS?fun1;
/*設(shè)置結(jié)束符為$*/
DELIMITER?$
/*創(chuàng)建函數(shù)*/
CREATE?FUNCTION?fun1()
??returns?INT
??BEGIN
????DECLARE?max_id?int?DEFAULT?0;
????SELECT?max(id)?INTO?max_id?FROM?t_user;
????return?max_id;
??END?$
/*設(shè)置結(jié)束符為;*/
DELIMITER?;

調(diào)用看效果:

mysql>?SELECT?fun1();
+--------+
|?fun1()?|
+--------+
|??????4?|
+--------+
1?row?in?set?(0.00?sec)
示例2:有參函數(shù)

創(chuàng)建函數(shù):

/*刪除函數(shù)*/
DROP?FUNCTION?IF?EXISTS?get_user_id;
/*設(shè)置結(jié)束符為$*/
DELIMITER?$
/*創(chuàng)建函數(shù)*/
CREATE?FUNCTION?get_user_id(v_name?VARCHAR(16))
??returns?INT
??BEGIN
????DECLARE?r_id?int;
????SELECT?id?INTO?r_id?FROM?t_user?WHERE?name?=?v_name;
????return?r_id;
??END?$
/*設(shè)置結(jié)束符為;*/
DELIMITER?;

運(yùn)行看效果:

mysql>?SELECT?get_user_id(name)?from?t_user;
+-------------------+
|?get_user_id(name)?|
+-------------------+
|?????????????????1?|
|?????????????????2?|
|?????????????????3?|
|?????????????????4?|
+-------------------+
4?rows?in?set?(0.00?sec)

存儲過程和函數(shù)的區(qū)別

存儲過程的關(guān)鍵字為procedure,返回值可以有多個,調(diào)用時用call一般用于執(zhí)行比較復(fù)雜的的過程體、更新、創(chuàng)建等語句

函數(shù)的關(guān)鍵字為function,返回值必須有一個,調(diào)用用select,一般用于查詢單個值并返回。文章來源地址http://www.zghlxwxcb.cn/news/detail-705687.html

存儲過程 函數(shù)
返回值 可以有0個或者多個 必須有一個
關(guān)鍵字 procedure function
調(diào)用方式 call select

到了這里,關(guān)于玩轉(zhuǎn)Mysql系列 - 第17篇:存儲過程&自定義函數(shù)詳解的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點(diǎn)擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • MySQL 自定義 split 存儲過程

    ? ? ? ? MySQL 沒有提供 split 函數(shù),但可以自己建立一個存儲過程,將具有固定分隔符的字符串轉(zhuǎn)成多行。之所以不能使用自定義函數(shù)實現(xiàn)此功能,是因為 MySQL 的自定義函數(shù)自能返回標(biāo)量值,不能返回多行結(jié)果集。 MySQL 8: MySQL 5: 測試: 返回指定下標(biāo)的元素:

    2024年02月11日
    瀏覽(16)
  • MySQL之存儲過程和存儲函數(shù)

    MySQL之存儲過程和存儲函數(shù)

    能夠?qū)⑼瓿商囟üδ艿腟QL指令進(jìn)行封裝(SQL指令集),編譯之后存儲在數(shù)據(jù)庫服務(wù)器上,并且為之取一個名字,客戶端可以通過名字直接調(diào)用這個SQL指令集,獲取執(zhí)行結(jié)果。 2.1 優(yōu)點(diǎn) (1)SQL指令無需經(jīng)客戶端編寫通過網(wǎng)絡(luò)傳送,可以節(jié)省網(wǎng)絡(luò)開銷,同時避免使用SQL指令在網(wǎng)絡(luò)傳

    2024年02月05日
    瀏覽(21)
  • MySQL存儲函數(shù)與存儲過程習(xí)題

    MySQL存儲函數(shù)與存儲過程習(xí)題

    創(chuàng)建表并插入數(shù)據(jù): 1、創(chuàng)建一個可以統(tǒng)計表格內(nèi)記錄條數(shù)的存儲函數(shù) ,函數(shù)名為count_sch() 先創(chuàng)建一個表并插入一些數(shù)據(jù): mysql d // mysql create function count_sch() - returns int - begin - declare i int default 0; - select count(*) into i from sch; - return i; - end // Query OK, 0 rows affected (0.00 sec) mysql sel

    2024年01月19日
    瀏覽(19)
  • 【MySql】MySql存儲過程與函數(shù)

    存儲過程沒有返回值,函數(shù)有返回值 存儲過程就是一組預(yù)先編譯好的SQL語句的封裝,需要執(zhí)行時客戶端向服務(wù)器發(fā)送調(diào)用請求,服務(wù)器就會將這一系列預(yù)先存儲好的SQL語句全部執(zhí)行。 簡單舉例:存儲過程的創(chuàng)建 DELIMITER意味將$設(shè)置為結(jié)束標(biāo)識,這樣就可以在存儲過程中使用分

    2024年02月09日
    瀏覽(16)
  • MySQL 存儲過程和函數(shù)

    目錄 一、存儲過程和函數(shù)概述 二、創(chuàng)建存儲過程和函數(shù) 1、創(chuàng)建存儲過程 2、創(chuàng)建存儲函數(shù) 三、查看/調(diào)用儲存過程和函數(shù) 1、查看儲存過程/函數(shù) 2、調(diào)用儲存過程/函數(shù) 四、修改/刪除存儲過程和函數(shù) 1、修改存儲過程和函數(shù) 2、刪除存儲過程和函數(shù) 五、練習(xí)? 存儲過程就是一

    2024年02月11日
    瀏覽(25)
  • 玩轉(zhuǎn)Mysql系列 - 第15篇:詳解視圖

    這是Mysql系列第15篇。 環(huán)境:mysql5.7.25,cmd命令中進(jìn)行演示。 需求背景 電商公司領(lǐng)導(dǎo)說:給我統(tǒng)計一下:當(dāng)月訂單總金額、訂單量、男女訂單占比等信息,我們啪啦啪啦寫了一堆很復(fù)雜的sql,然后發(fā)給領(lǐng)導(dǎo)。 這樣一大片sql,發(fā)給領(lǐng)導(dǎo),你們覺得好么? 如果領(lǐng)導(dǎo)只想看其中某

    2024年02月09日
    瀏覽(15)
  • 玩轉(zhuǎn)Mysql系列 - 第16篇:變量詳解

    這是Mysql系列第16篇。 環(huán)境:mysql5.7.25,cmd命令中進(jìn)行演示。 代碼中被[]包含的表示可選,|符號分開的表示可選其一。 我們在使用mysql的過程中,變量也會經(jīng)常用到,比如查詢系統(tǒng)的配置,可以通過查看系統(tǒng)變量來了解,當(dāng)我們需要修改系統(tǒng)的一些配置的時候,也可以通過修

    2024年02月09日
    瀏覽(23)
  • 玩轉(zhuǎn)Mysql系列 - 第14篇:詳解事務(wù)

    環(huán)境:mysql5.7.25,cmd命令中進(jìn)行演示。 開發(fā)過程中,會經(jīng)常用到數(shù)據(jù)庫事務(wù),所以本章非常重要。 本篇內(nèi)容 什么是事務(wù),它有什么用? 事務(wù)的幾個特性 事務(wù)常見操作指令詳解 事務(wù)的隔離級別詳解 臟讀、不可重復(fù)讀、可重復(fù)讀、幻讀詳解 演示各種隔離級別產(chǎn)生的現(xiàn)象 關(guān)于

    2024年02月10日
    瀏覽(20)
  • 玩轉(zhuǎn)Mysql系列 - 第19篇:游標(biāo)詳解

    這是Mysql系列第19篇。 環(huán)境:mysql5.7.25,cmd命令中進(jìn)行演示。 代碼中被[]包含的表示可選,|符號分開的表示可選其一。 需求背景 當(dāng)我們需要對一個select的查詢結(jié)果進(jìn)行遍歷處理的時候,如何實現(xiàn)呢? 此時我們需要使用游標(biāo),通過游標(biāo)的方式來遍歷select查詢的結(jié)果集,然后對

    2024年02月09日
    瀏覽(23)
  • MySQL-15.存儲過程和函數(shù)

    MySQL從5.0版本開始支持存儲過程和函數(shù)。存儲過程和函數(shù)能夠?qū)?fù)雜的SQL邏輯封裝在一起,應(yīng)用程序無須關(guān)注存儲過程和函數(shù)內(nèi)部復(fù)雜的SQL邏輯,而只需要簡單地調(diào)用存儲過程和函數(shù)即可。 1.1 理解 含義 :存儲過程的英文是 Stored Procedure 。它的思想很簡單,就是一組經(jīng)過 預(yù)先

    2024年02月21日
    瀏覽(23)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包