最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MySQL存儲過程的創(chuàng)建、調(diào)用與管理詳解

 更新時間:2021年03月20日 11:13:39   作者:ʜғ  
這篇文章主要給大家介紹了關(guān)于MySQL存儲過程的創(chuàng)建、調(diào)用與管理的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

存儲過程簡介

為什么要用存儲過程?

MySQL5.0 版本開始支持存儲過程。

大多數(shù) SQL 語句都是針對一個或多個表的單條語句。并非所有的操作都那么簡單。經(jīng)常會有一個完整的操作需要多條語句才能完成。

存儲過程簡單來說,就是為以后的使用而保存的一條或多條 MySQL 語句的集合??蓪⑵湟暈榕幚砦募km然他們的作用不僅限于批處理。

存儲過程思想上很簡單,就是數(shù)據(jù)庫 SQL 語言層面的代碼封裝與重用。

存儲過程的優(yōu)點

  1. 通過把處理封裝在容易使用的單元中,簡化復(fù)雜的操作;
  2. 簡化對變動的管理。如果表名、列名或業(yè)務(wù)邏輯有變化。只需要更改存儲過程的代碼,使用它的人員不會改自己的代碼;
  3. 通常存儲過程有助于提高應(yīng)用程序的性能。當(dāng)創(chuàng)建的存儲過程被編譯之后,就存儲在數(shù)據(jù)庫中。 但是,MySQL 實現(xiàn)的存儲過程略有不同。MySQL 存儲過程按需編譯。在編譯存儲過程之后,MySQL 將其放入緩存中。MySQL 為每個連接維護(hù)自己的存儲過程高速緩存。如果應(yīng)用程序在單個連接中多次使用存儲過程,則使用編譯版本,否則存儲過程的工作方式類似于查詢;
  4. 存儲過程有助于減少應(yīng)用程序和數(shù)據(jù)庫服務(wù)器之間的流量,因為應(yīng)用程序不必發(fā)送多個冗長的 SQL 語句,而只用發(fā)送存儲過程的名稱和參數(shù);
  5. 存儲的程序?qū)θ魏螒?yīng)用程序都是可重用的和透明的。存儲過程將數(shù)據(jù)庫接口暴露給所有應(yīng)用程序,以便開發(fā)人員不必開發(fā)存儲過程中已支持的功能;
  6. 存儲的程序是安全的。數(shù)據(jù)庫管理員可以向訪問數(shù)據(jù)庫中存儲過程的應(yīng)用程序授予適當(dāng)?shù)臋?quán)限,而不向基礎(chǔ)數(shù)據(jù)庫表提供任何權(quán)限。

存儲過程的缺點

  1. 如果使用大量存儲過程,那么使用這些存儲過程的每個連接的內(nèi)存使用量將會大大增加。 此外,如果您在存儲過程中過度使用大量邏輯操作,則 CPU 使用率也會增加,因為 MySQL 數(shù)據(jù)庫最初的設(shè)計側(cè)重于高效的查詢,不利于邏輯運算;
  2. 存儲過程的構(gòu)造使得開發(fā)具有復(fù)雜業(yè)務(wù)邏輯的存儲過程變得更加困難;
  3. 很難調(diào)試存儲過程。只有少數(shù)數(shù)據(jù)庫管理系統(tǒng)允許您調(diào)試存儲過程。不幸的是,MySQL 不提供調(diào)試存儲過程的功能;
  4. 開發(fā)和維護(hù)存儲過程并不容易。開發(fā)和維護(hù)存儲過程通常需要一個不是所有應(yīng)用程序開發(fā)人員擁有的專業(yè)技能。這可能會導(dǎo)致應(yīng)用程序開發(fā)和維護(hù)階段的問題。

MySQL 中的存儲過程

創(chuàng)建與調(diào)用過程

創(chuàng)建存儲過程,代碼如下所示:

-- 創(chuàng)建存儲過程 
create procedure mypro(in a int,in b int,out sum int) 
begin 
set sum = a+b; 
end;

運行結(jié)果如下

image-20210316103451673

也可以在 Navicat 客戶端“函數(shù)”節(jié)點下查看過程,如下圖所示:

image-20210316103523273

調(diào)用存儲過程,代碼如下所示:

call mypro(1,2,@s);-- 調(diào)用存儲過程 
select @s;-- 顯示過程輸出結(jié)果

運行結(jié)果

image-20210316103610471

存儲過程語法解析

  • create procedure 用來創(chuàng)建過程;
  • mypro 用來定義過程名稱;
  • (in a int,in b int,out sum int)表示過程的參數(shù),其中 in 表示輸入?yún)?shù),out 表示輸出參數(shù)。類似于 Java 定義方法時的形參和返回值;
  • begin 與end 表示過程主體的開始和結(jié)束,相當(dāng)于 Java 定義方法的一對大括號;
  • call用來調(diào)用過程,@s 是用來接收過程輸出參數(shù)的變量

存儲過程的參數(shù)

MySQL 存儲過程的參數(shù)用在存儲過程的定義,共有三種參數(shù)類型:

  • IN 輸入?yún)?shù):表示調(diào)用者向過程傳入值(傳入值可以是字面量或變量);
  • OUT 輸出參數(shù):表示過程向調(diào)用者傳出值(可以返回多個值)(傳出值只能是變量);
  • INOUT輸入輸出參數(shù):既表示調(diào)用者向過程傳入值,又表示過程向調(diào)用者傳出值(值只能是變量)。

存儲過程根據(jù)參數(shù)可分為四種類別:

1).沒有參數(shù)的過程;

2).只有輸入?yún)?shù)的過程;

3).只有輸出參數(shù)的過程;

4).包含輸入和輸出參數(shù)的過程。

變量

MySQL 中的存儲過程類似 java 中的方法。

既然如此,在存儲過程中也同樣可以使用變量。java 中的局部變量作用域是變量所在的方法,而 MySQL 中的局部變量作用域是所在的存儲過程。

變量定義

DECLARE variable_name [,variable_name...] datatype [DEFAULT value];

declare用于聲明變量;

variable_name表示變量名稱;

datatype為 MySQL 的數(shù)據(jù)類型;

default用于聲明默認(rèn)值;

例如:

declare name varchar(20) default ‘jack'。

變量賦值

SET 變量名 = 表達(dá)式值 [,variable_name = expression ...]

在存儲過程中使用變量,代碼如下所示

use schooldb;-- 使用 schooldb 數(shù)據(jù)庫
-- 創(chuàng)建過程
create procedure mypro1()
begin
declare name varchar(20);
set name = '丘處機(jī)';
select * from studentinfo where studentname = name;
end;
-- 調(diào)用過程
call mypro1();

運行結(jié)果

image-20210316104419334

流程控制語句

if 條件語句

IF 語句包含多個條件判斷,根據(jù)結(jié)果為 TRUEFALSE執(zhí)行語句,與編程語言中的 if、else if、else 語法類似。

定義存儲過程,輸入一個整數(shù),使用 if 語句判斷是正數(shù)還是負(fù)數(shù),代碼如下所示:

-- 創(chuàng)建過程
create procedure mypro2(in num int)
begin
if num<0 then -- 條件開始
select '負(fù)數(shù)';
elseif num=0 then
select '不是正數(shù)也不是負(fù)數(shù)';
else
select '正數(shù)';
end if;-- 條件結(jié)束
end;
-- 調(diào)用過程
call mypro2(-1);

運行結(jié)果

image-20210316104810016

case 條件語句

case是另一個條件判斷的語句,類似于編程語言中的 choose、when語法。MySQL 中的 case語句有兩種語法
格式。

定義存儲過程,輸入一個整數(shù),使用 case 語句判斷是正數(shù)還是負(fù)數(shù),代碼如下所示:

-- 創(chuàng)建過程
create procedure mypro3(in num int)
begin
case -- 條件開始
when num<0 then select '負(fù)數(shù)';
when num=0 then select '不是正數(shù)也不是負(fù)數(shù)';
else select '正數(shù)';
end case; -- 條件結(jié)束
end;
-- 調(diào)用過程
call mypro3(1);

運行結(jié)果

image-20210316104934579

定義存儲過程,輸入一個整數(shù),使用 case 語句判斷是 1 還是 2,代碼如下所示:

-- 創(chuàng)建過程
create procedure mypro4(in num int)
begin
case num -- 條件開始
when 1 then select '數(shù)值是 1';
when 2 then select '數(shù)值是 2';
else select '不是 1 也不是 2';
end case; -- 條件結(jié)束
end;
-- 調(diào)用過程
call mypro4(3);

運行結(jié)果

image-20210316105009743

兩種 case 語法都可以實現(xiàn)條件判斷,但第一種適合范圍值判斷,而第二種適合確定值判斷。

while 循環(huán)語句

while語句的用法和 java中的 while循環(huán)類似。

定義存儲過程,使用 while 循環(huán)輸出 1 到 10 的累加和,代碼如下所示:

-- 創(chuàng)建過程
create procedure mypro5(out sum int)
begin
declare num int default 0;
set sum = 0;
while num<10 do -- 循環(huán)開始
set num = num+1;
set sum = sum+num;
end while; -- 循環(huán)結(jié)束
end;
-- 調(diào)用過程
call mypro5(@sum);
-- 查詢變量值
select @sum;

運行結(jié)果

image-20210316105127457

repeat 循環(huán)語句

repeat語句的用法和 java中的 do…while 語句類似,都是先執(zhí)行循環(huán)操作,再判斷條件,區(qū)別是 repeat表達(dá)
式值為 false時才執(zhí)行循環(huán)操作,直到表達(dá)式值為 true停止。

定義存儲過程,使用 repeat 循環(huán)輸出 1 到 10 的累加和,代碼如下所示:

-- 創(chuàng)建過程
create procedure mypro6(out sum int)
begin
declare num int default 0;
set sum = 0;
repeat-- 循環(huán)開始
set num = num+1;
set sum = sum+num;
until num>=10
end repeat; -- 循環(huán)結(jié)束
end;
-- 調(diào)用過程
call mypro6(@sum);
-- 查詢變量值
select @sum;

運行結(jié)果

image-20210316105241308

loop 循環(huán)語句

循環(huán)語句,用來重復(fù)執(zhí)行某些語句。

執(zhí)行過程中可使用 leave語句或 iterate 跳出循環(huán),也可以嵌套 IF等判斷語句。

leave語句效果相當(dāng)于 java 中的 break,用來終止循環(huán);

iterate語句效果相當(dāng)于 java 中的 continue,用來結(jié)束本次循環(huán)操作,進(jìn)入下一次循環(huán)。

定義存儲過程,使用 loop 循環(huán)輸出 1 到 10 的累加和,代碼如下所示:

-- 創(chuàng)建過程
create procedure mypro7(out sum int)
begin
declare num int default 0;
set sum = 0;
loop_sum:loop-- 循環(huán)開始
set num = num+1;
set sum = sum+num;
if num>=10 then
leave loop_sum;
end if;
end loop loop_sum; -- 循環(huán)結(jié)束
end;
-- 調(diào)用過程
call mypro7(@sum);
-- 查詢變量值
select @sum;

運行結(jié)果

image-20210316105416021

代碼中的 loop_sum 相當(dāng)于給循環(huán)貼個標(biāo)簽,方便多重循環(huán)時靈活操作。

存儲過程的管理

存儲過程的管理主要包括:顯示過程、顯示過程源碼、刪除過程。

比較簡單的方式就是利用 navicat 客戶端工具進(jìn)行管理,鼠標(biāo)點擊操作即可,如下圖所示:

image-20210316105545505

顯示存儲過程

SHOW PROCEDURE STATUS;

顯示特定數(shù)據(jù)庫的存儲過程

SHOW PROCEDURE status where db = 'schooldb';

顯示特定模式的存儲過程,要求顯示名稱中包含“my”的存儲過程

SHOW PROCEDURE status where name like '%my%';

顯示存儲過程“mypro1”的源碼

SHOW CREATE PROCEDURE mypro1;

image-20210316105740141

刪除存儲過程“mypro1”

drop PROCEDURE mypro1;

總結(jié)

到此這篇關(guān)于MySQL存儲過程的創(chuàng)建、調(diào)用與管理的文章就介紹到這了,更多相關(guān)MySQL存儲過程內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • MySQL報錯sql_mode=only_full_group_by的問題解決

    MySQL報錯sql_mode=only_full_group_by的問題解決

    本文主要介紹了MySQL報錯sql_mode=only_full_group_by的問題解決,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-02-02
  • MYSQL中的簡單查詢

    MYSQL中的簡單查詢

    這篇文章詳細(xì)介紹了MySQL中常見的查詢語法,包括SELECT語句的簡單查詢、基于表的查詢、基于條件的查詢、基于分組的查詢等,它還解釋了COUNT()、SUM()、AVG()、MAX()和MIN()等聚合函數(shù)的使用,以及GROUP BY和HAVING子句在分組查詢中的應(yīng)用
    2025-02-02
  • mysql日期函數(shù)用法大全

    mysql日期函數(shù)用法大全

    日期函數(shù)在實際應(yīng)用中可以幫助你輕松處理和操作日期時間數(shù)據(jù),使得數(shù)據(jù)庫操作更為靈活和便捷,本文主要介紹了mysql日期函數(shù)用法大全,感興趣的可以了解一下
    2024-05-05
  • mysql 如何使用JSON_EXTRACT() 取json值

    mysql 如何使用JSON_EXTRACT() 取json值

    這篇文章主要介紹了mysql如何使用JSON_EXTRACT() 取json值的操作方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • mysql中找不到my.ini文件的問題及解決

    mysql中找不到my.ini文件的問題及解決

    這篇文章主要介紹了mysql中找不到my.ini文件的問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • navicat連接mysql修改root密碼最簡潔方法

    navicat連接mysql修改root密碼最簡潔方法

    這篇文章主要介紹了navicat連接mysql修改root密碼,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-05-05
  • MySQL數(shù)據(jù)表分區(qū)技術(shù)PARTITION詳解

    MySQL數(shù)據(jù)表分區(qū)技術(shù)PARTITION詳解

    在處理大規(guī)模數(shù)據(jù)時,數(shù)據(jù)庫性能的優(yōu)化變得尤為重要,MySQL提供了一種稱為“分區(qū)”(Partitioning)的技術(shù),可以顯著提高查詢效率和管理大型數(shù)據(jù)庫表的能力,本文將詳細(xì)介紹MySQL中的數(shù)據(jù)表分區(qū)技術(shù),包括其基本概念、類型以及如何實現(xiàn)和維護(hù),需要的朋友可以參考下
    2025-02-02
  • navicat創(chuàng)建MySql定時任務(wù)的方法詳解

    navicat創(chuàng)建MySql定時任務(wù)的方法詳解

    這篇文章主要介紹了navicat創(chuàng)建MySql定時任務(wù)的方法詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10
  • Mysql數(shù)據(jù)庫鎖定機(jī)制詳細(xì)介紹

    Mysql數(shù)據(jù)庫鎖定機(jī)制詳細(xì)介紹

    這篇文章主要介紹了Mysql數(shù)據(jù)庫鎖定機(jī)制詳細(xì)介紹,本文用大量內(nèi)容講解了Mysql中的鎖定機(jī)制,例如MySQL鎖定機(jī)制簡介、合理利用鎖機(jī)制優(yōu)化MySQL等內(nèi)容,需要的朋友可以參考下
    2014-12-12
  • windows 10下解壓版MySql安裝配置方法教程

    windows 10下解壓版MySql安裝配置方法教程

    這篇文章主要為大家詳細(xì)介紹了windows 10下解壓版MySql安裝配置方法教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-11-11

最新評論

云林县| 西平县| 伊吾县| 大新县| 简阳市| 壤塘县| 惠来县| 左贡县| 澳门| 根河市| 巴林右旗| 浑源县| 西宁市| 襄汾县| 同仁县| 新泰市| 黑河市| 荔波县| 新平| 老河口市| 安达市| 甘孜| 新安县| 博野县| 于田县| 长丰县| 贵州省| 兴和县| 常德市| 哈密市| 二连浩特市| 盖州市| 宜昌市| 聂拉木县| 兴城市| 永川市| 葫芦岛市| 邵东县| 东丽区| 仙游县| 奉节县|