日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > 数据库 >内容正文

数据库

@select 怎么写存储过程_MySQL4:存储过程和函数

發(fā)布時(shí)間:2023/12/1 数据库 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 @select 怎么写存储过程_MySQL4:存储过程和函数 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

什么是存儲(chǔ)過(guò)程

簡(jiǎn)單說(shuō),存儲(chǔ)過(guò)程就是一條或多條SQL語(yǔ)句的集合,可視為批文件,但是起作用不僅限于批處理。本文主要講解如何創(chuàng)建存儲(chǔ)過(guò)程和存儲(chǔ)函數(shù)以及變量的使用,如何調(diào)用、查看、修改、刪除存儲(chǔ)過(guò)程和存儲(chǔ)函數(shù)等。使用的數(shù)據(jù)庫(kù)和表還是之前寫JDBC用的數(shù)據(jù)庫(kù)和表:

create database school;use school;create table student( studentId int primary key auto_increment not null, studentName varchar(10) not null, studentAge int, studentPhone varchar(15))insert into student values(null,'Betty', '20', '00000000');insert into student values(null,'Jerry', '18', '11111111');insert into student values(null,'Betty', '21', '22222222');insert into student values(null,'Steve', '27', '33333333');insert into student values(null,'James', '22', '44444444');commit;

存儲(chǔ)程序可以分為存儲(chǔ)過(guò)程和函數(shù),MySQL中創(chuàng)建存儲(chǔ)過(guò)程和函數(shù)的語(yǔ)句分別是:CREATE PROCEDURE和CREATE FUNCTION。使用CALL語(yǔ)句來(lái)調(diào)用存儲(chǔ)過(guò)程,只能用輸出變量返回值。函數(shù)可以從語(yǔ)句外調(diào)用(即通過(guò)引用函數(shù)名),也能返回標(biāo)量值。存儲(chǔ)過(guò)程也可以調(diào)用其他存儲(chǔ)過(guò)程。

創(chuàng)建存儲(chǔ)過(guò)程

創(chuàng)建存儲(chǔ)過(guò)程,需要使用CREATE PROCEDURE語(yǔ)句,語(yǔ)句基本格式如下:

CREATE PROCEDURE sp_name([proc_parameter]) [characteristics ...] routine_body

解釋一下:

1、CREATE PROCEDURE為創(chuàng)建存儲(chǔ)過(guò)程的關(guān)鍵字

2、sp_name為存儲(chǔ)過(guò)程的名字

3、proc_parameter為指定存儲(chǔ)過(guò)程的參數(shù)列表,列表形式為[IN|OUT|INOUT] param_name type。其中,IN表示輸入?yún)?shù),OUT表示輸出參數(shù),INOUT表示既可以輸入也可以輸出,param_name表示參數(shù)名稱,type表示參數(shù)類型,該類型可以是MySQL數(shù)據(jù)庫(kù)中的任意類型

4、characteristics指定存儲(chǔ)過(guò)程的特性

5、routime_body是SQL代碼的內(nèi)容,可以用BEGIN...END來(lái)表示SQL代碼的開(kāi)始和結(jié)束

編寫存儲(chǔ)過(guò)程不是簡(jiǎn)單的事情,可能存儲(chǔ)過(guò)程中需要復(fù)雜的SQL語(yǔ)句,并且要有創(chuàng)建存儲(chǔ)過(guò)程的權(quán)限;但是使用存儲(chǔ)過(guò)程將簡(jiǎn)化操作,減少冗余的操作步驟,同時(shí)還可以減少操作過(guò)程中的事物,提高效率,因此存儲(chǔ)過(guò)程是非常有用的。下面看兩個(gè)存儲(chǔ)過(guò)程,一個(gè)查詢student表中的所有字段,一個(gè)根據(jù)student表的Age字段算一個(gè)Age的平均值:

CREATE PROCEDURE proc ()BEGIN SELECT * FROM student;END;CREATE PROCEDURE AvgStudentAge()BEGIN SELECT AVG(studentAge) AS avgAge FROM student;END;

上面都是不帶參數(shù)的存儲(chǔ)過(guò)程,下面看一個(gè)帶參數(shù)的存儲(chǔ)過(guò)程:

DELIMITER //CREATE PROCEDURE CountStudent(IN sName VARCHAR(10), OUT num INT)BEGIN SELECT COUNT(*) INTO num FROM student WHERE studentName = sName;END //

上述代碼的作用是創(chuàng)建一個(gè)獲取student表記錄條數(shù)的存儲(chǔ)過(guò)程,名稱為CountStudent,根據(jù)傳入的學(xué)生姓名COUNT(*)后把結(jié)果放入?yún)?shù)num中。

注意另外一個(gè)細(xì)節(jié),上述代碼第一行使用了"DELIMITER //",這句語(yǔ)句的作用是把MySQL的結(jié)束符設(shè)置為"//",因?yàn)镸ySQL默認(rèn)的語(yǔ)句結(jié)束符號(hào)為分號(hào)";",為了避免與存儲(chǔ)過(guò)程中SQL語(yǔ)句結(jié)束符相沖突,需要使用DELIMITER改變存儲(chǔ)過(guò)程的結(jié)束符,并以"END //"結(jié)束存儲(chǔ)過(guò)程。存過(guò)程定義完畢之后再使用"DELIMITER ;"恢復(fù)默認(rèn)結(jié)束符。DELIMITER也可以指定其他符號(hào)作為結(jié)束符。

創(chuàng)建存儲(chǔ)函數(shù)

創(chuàng)建存儲(chǔ)函數(shù)需要使用CREATE FUNCATION語(yǔ)句,其基本語(yǔ)法如下:

CREATE FUNCTION func_name([func_parameter]) RETURNS type[characteristic ...] routine_body

解釋一下:

1、CREATE_FUNCTION為用來(lái)創(chuàng)建存儲(chǔ)函數(shù)的關(guān)鍵字

2、func_name表示存儲(chǔ)函數(shù)的名稱

3、func_parameter為存儲(chǔ)過(guò)程的參數(shù)列表,參數(shù)列表形式為[IN|OUT|INOUT] param_name type,和存儲(chǔ)過(guò)程一樣

4、RETURNS type表示函數(shù)返回?cái)?shù)據(jù)的類型

5、characteristic表示存儲(chǔ)函數(shù)的特性,和存儲(chǔ)過(guò)程一樣

舉個(gè)例子:

CREATE FUNCTION NameByZip() RETURNS CHAR(50)RETURN (select studentPhone from student where studentName = 'JAMES');

提兩點(diǎn):

1、如果在存儲(chǔ)函數(shù)中的RETURN語(yǔ)句返回一個(gè)類型不同于函數(shù)的RETURNS自居指定的類型的值,返回值將被強(qiáng)制為恰當(dāng)?shù)念愋?/p>

2、指定參數(shù)為IN、OUT或INOUT只對(duì)PROCEDURE是合法的(FUNCTION中總是默認(rèn)為IN參數(shù))。RETURNS子句只能對(duì)FUNCTION做指定,對(duì)于函數(shù)而言這是強(qiáng)制性的,它用來(lái)指定函數(shù)的返回類型,而且函數(shù)體必須包含一個(gè)RETURN value語(yǔ)句

變量的使用

變量可以在子程序中聲明并使用,這些變量的作用范圍是在BEGIN...END程序中,在存儲(chǔ)過(guò)程中可以使用DECLARE語(yǔ)句定義變量,語(yǔ)法如下:

DECLARE var_name[,varame]... date_type [DEFAULT value]

解釋一下:

1、var_name為局部變量的名稱

2、DEFAULT value子句給變量提供一個(gè)默認(rèn)值,值除了可以被聲明為一個(gè)常數(shù)之外,還可以被指定為一個(gè)表達(dá)式。如果沒(méi)有DEFAULT子句,那么初始值為NULL

定義變量后,為變量賦值可以改變變量的默認(rèn)值,MySQL使用SET為變量賦值:

SET var_name=expr[, var_name=expr] ...;

舉個(gè)例子:

DECLARE var1 INT DEFAULT 100;DECLARE var2, var3, var4 INT;SET var2 = 10, var3 = 20;SET var4 = var2 + var3;

當(dāng)然,我們使用SELECT語(yǔ)句也可以給變量賦值:

DECLARE t_studentName CHAR(20);DECLARE t_studentAge INT;SELECT studentName, studentId INTO t_studentName, t_studentAge FROM student where studentName = 'Bruce';DECLARE t_studentName CHAR(20);DECLARE t_studentAge INT;

游標(biāo)的使用

查詢語(yǔ)句可能返回多條記錄,如果數(shù)據(jù)量非常大,需要在存儲(chǔ)過(guò)程和存儲(chǔ)函數(shù)中使用游標(biāo)來(lái)逐條讀取查詢結(jié)果集中的記錄。應(yīng)用程序可以根據(jù)需要滾動(dòng)或?yàn)g覽器中的程序。

游標(biāo)必須在處理程序之前被聲明,并且變量和條件還必須在聲明游標(biāo)或處理程序之前被聲明。MySQL中聲明游標(biāo)的方法為:

DECLARE cursor_name CURSOR FOR select_statement

解釋一下:

1、cursor_name表示游標(biāo)的名稱

2、select_statement表示SELECT語(yǔ)句返回的內(nèi)容,返回一個(gè)用于創(chuàng)建游標(biāo)的結(jié)果集

定義了游標(biāo),就要打開(kāi)游標(biāo),打開(kāi)游標(biāo)的方法為:

OPEN cursor_name{游標(biāo)名稱}

再就是使用游標(biāo)了,使用游標(biāo)的方法為:

FETCH cursor_name INTO var_name [, var_name] ... {參數(shù)名稱}

最后游標(biāo)使用完了,要關(guān)閉:

CLOSE cursor_name{游標(biāo)名稱}

舉個(gè)例子:

DECLARE t_studentName CHAR(20);DECLARE t_studentAge INT;DECLARE cur_student CURSOR FOR SELECT studentName, studentId FROM student where studentName = 'Bruce';OPEN cur_student;FETCH cur_student INTO t_studentName, t_studentAge;...CLOSE cur_student;

studentName為Bruce的在數(shù)據(jù)里面不止一條記錄,創(chuàng)建游標(biāo)之后就從student表中查出了studentName和studentId的值。OPEN這個(gè)游標(biāo),通過(guò)FETCH之后遍歷每一組studentName和studentAge,并放入申明的變量t_studentName和t_studentAge中,之后想怎么用這兩個(gè)字段怎么用這兩個(gè)字段了。注意,游標(biāo)用完關(guān)閉掉。

IF、CASE、LOOP、LEAVE、ITERATE、REPEAT

這六個(gè)比較簡(jiǎn)單,放在一起講了,簡(jiǎn)單說(shuō)下用法,除了第一個(gè)IF寫個(gè)例子以外,別的就不寫例子了,可以自己嘗試下。

1、IF

IF語(yǔ)句包含多個(gè)判斷條件,根據(jù)判斷的結(jié)果為TRUE或FALSE執(zhí)行相應(yīng)的語(yǔ)句,其格式為:

IF expr_condition THEN statement_list [ELSEIF expr_condition THEN statement_list] [ELSE statement_list] END IF

比如:

IF t_studentName IS NULL THEN SELECT studentName INTO t_studentName FROM student where studentName = 'Bruce'; ELSE UPDATE studentName set student = NULL where studentName = 'Bruce';END IF;

2、CASE

case是另外一個(gè)進(jìn)行條件判斷的語(yǔ)句,該語(yǔ)句有兩種格式,第一種格式如下:

CASE case_expr WHEN when_value THEN statement_list [WHEN when_value THEN statement_list] ... [ELSE statement_list]END CASE

其中,case_expr參數(shù)表示判斷的表達(dá)式,決定了哪一個(gè)WHEN自居會(huì)被執(zhí)行;when_value表示表達(dá)式可能的值,如果某個(gè)when_value表達(dá)式與case_expr表達(dá)式結(jié)果相同,則執(zhí)行對(duì)應(yīng)THEN關(guān)鍵字后的statement_list中的語(yǔ)句;statement_list參數(shù)表示不同when_value值的執(zhí)行語(yǔ)句。

CASE語(yǔ)句的第二種格式為:

CASE WHEN expr_condition THEN statement_list [WHEN expr_condition THEN statement_list] ... [ElSE statement_list]END CASE

只是寫法稍微變了一下,參數(shù)還是第一種寫法的意思

3、LOOP

LOOP循環(huán)用來(lái)重復(fù)執(zhí)行某些語(yǔ)句,與IF和CASE相比,LOOP只是創(chuàng)建一個(gè)循環(huán)操作的過(guò)程,并不進(jìn)行條件判斷。LOOP內(nèi)的語(yǔ)句一直被重復(fù)執(zhí)行直到循環(huán)被退出,跳出循環(huán)過(guò)程,使用LEAVE子句。LOOP語(yǔ)句j的基本格式如下:

[loop_label:] LOOP statement_listEND LOOP

其中l(wèi)oop_label表示LOOP語(yǔ)句的標(biāo)注名稱,該參數(shù)可以省略;statement_list參數(shù)表示需要循環(huán)執(zhí)行的語(yǔ)句

4、LEAVE

LEAVE語(yǔ)句用來(lái)退出任何被標(biāo)注的流程控制構(gòu)造,LEAVE語(yǔ)句的基本格式如下:

LEAVE label

5、ITERATE

ITERATE語(yǔ)句將執(zhí)行順序轉(zhuǎn)到語(yǔ)句段開(kāi)頭出,語(yǔ)句基本格式如下:

ITERATE label

6、REPEAT

REPEAT語(yǔ)句用來(lái)創(chuàng)建一個(gè)帶有條件判斷的循環(huán)過(guò)程,每次與局執(zhí)行完畢之后,會(huì)對(duì)條件表達(dá)式進(jìn)行判斷,如果表達(dá)式為真,則循環(huán)結(jié)束,否則重復(fù)執(zhí)行循環(huán)中的語(yǔ)句。REPEAT語(yǔ)句的基本格式如下:

[repeat_label:] REPEAT statement_listUNTIL expr_conditionEND REPEAT

其中,repeat_label為REPEAT語(yǔ)句的標(biāo)注名稱,該參數(shù)可以省略;REPEAT語(yǔ)句內(nèi)的語(yǔ)句或語(yǔ)句群被重復(fù),直至expr_condition為真

調(diào)用存儲(chǔ)過(guò)程和函數(shù)

存儲(chǔ)過(guò)程已經(jīng)定義好了,接下來(lái)無(wú)非就是調(diào)用。存儲(chǔ)過(guò)程和函數(shù)有很多種調(diào)用方法,存儲(chǔ)過(guò)程必須使用CALL語(yǔ)句調(diào)用,并且存儲(chǔ)過(guò)程和數(shù)據(jù)庫(kù)相關(guān),如果要執(zhí)行其他數(shù)據(jù)庫(kù)中的存儲(chǔ)過(guò)程,需要指定數(shù)據(jù)庫(kù)名稱,例如CALL dbname.procname。存儲(chǔ)函數(shù)的調(diào)用與MySQL中預(yù)定義的函數(shù)調(diào)用方式相同。

1、調(diào)用存儲(chǔ)過(guò)程

存儲(chǔ)過(guò)程是通過(guò)CALL語(yǔ)句進(jìn)行調(diào)用的,語(yǔ)法如下:

CALL sp_name([parameter[,...]])

舉個(gè)例子,就調(diào)用最前面那個(gè)CountStudent的存儲(chǔ)過(guò)程:

CALL CountStudent('Bruce', @num);select @num;

運(yùn)行結(jié)果為:

2、調(diào)用存儲(chǔ)函數(shù)

MySQL中調(diào)用存儲(chǔ)函數(shù)的使用方法和MySQL內(nèi)部函數(shù)的使用方法是一樣的,無(wú)非存儲(chǔ)函數(shù)是用戶自己定義的,內(nèi)部函數(shù)是MySQL開(kāi)發(fā)者定義的。

我們調(diào)用一下上面定義的NameByZip那個(gè)函數(shù):

select NameByZip();

運(yùn)行結(jié)果為:

可以對(duì)照一下,studenName為"James"這一條,對(duì)應(yīng)的studentPhone就是"44444444",符合SELECT出來(lái)的結(jié)果

查看、刪除存儲(chǔ)過(guò)程和函數(shù)

1、查看存儲(chǔ)過(guò)程和函數(shù)的狀態(tài)

SHOW STATUS可以查看存儲(chǔ)過(guò)程核函數(shù)的狀態(tài),其基本語(yǔ)法結(jié)構(gòu)如下:

SHOW {PROCEDURE | FUNCTIOn} STATUS [LIKE 'pattern'

這個(gè)語(yǔ)句是一個(gè)MySQL的擴(kuò)展,他返回子程序的特征,如數(shù)據(jù)庫(kù)、名字、類型、創(chuàng)建者及創(chuàng)建和修改日期。如果沒(méi)有指定樣式,根據(jù)使用的語(yǔ)句,所有存儲(chǔ)過(guò)程或存儲(chǔ)函數(shù)的信息都被列出。PROCEDURE和FUNCTIOn分別表示查看存儲(chǔ)過(guò)程和函數(shù),LIKE語(yǔ)句表示匹配存儲(chǔ)過(guò)程或函數(shù)的名稱。

舉個(gè)例子:

SHOW PROCEDURE STATUS

運(yùn)行結(jié)果為:

后面還有一些字段,截圖截不全沒(méi)辦法。查看存儲(chǔ)函數(shù)也一樣,可以自己試試看。

2、查看存儲(chǔ)過(guò)程和函數(shù)的定義

除了SHOW STATUS外,還可以使用SHOW CREATE來(lái)查看存儲(chǔ)過(guò)程的定義,基本格式為:

SHOW CREATE {PROCEDURE | FUNCTION} sp_name

比如:

SHOW CREATE FUNCTION NameByZip

我查看了NameByZip這個(gè)函數(shù)的定義,結(jié)果為:

這個(gè)Create Function字段就是創(chuàng)建的存儲(chǔ)函數(shù)的內(nèi)容

3、刪除存儲(chǔ)過(guò)程和函數(shù)

刪除存儲(chǔ)過(guò)程核函數(shù),可以使用DROP語(yǔ)句,基本語(yǔ)法如下:

DROP {PROCEDURE | FUNCTION} [IF EXISTS] sp_name

這個(gè)語(yǔ)句被用來(lái)移除一個(gè)存儲(chǔ)過(guò)程或函數(shù)。sp_name為待移除的存儲(chǔ)過(guò)程或函數(shù)的名稱。

IF EXISTS子句是一個(gè)MySQL的擴(kuò)展,如果程序或函數(shù)不存儲(chǔ),它可以防止錯(cuò)誤發(fā)生,產(chǎn)生一個(gè)用SHOW WARNINGS查看的警告。舉個(gè)例子:

DROP PROCEDURE CountStudentDROP FUNCTION NameByZip;

這么簡(jiǎn)單就可以了。注意這里沒(méi)有講修改存儲(chǔ)過(guò)程和存儲(chǔ)函數(shù),因?yàn)樾薷拇鎯?chǔ)過(guò)程或者函數(shù)只能修改存儲(chǔ)過(guò)程或者存儲(chǔ)函數(shù)的特性,不能直接對(duì)已有的存儲(chǔ)過(guò)程或函數(shù)進(jìn)行修改,如果必須要改,只能先DROP在重新編寫代碼,CREATE一個(gè)新的。

總結(jié)

以上是生活随笔為你收集整理的@select 怎么写存储过程_MySQL4:存储过程和函数的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。