数据库系统原理(第5章:数据库编程)
一、存儲(chǔ)過(guò)程
概念:存儲(chǔ)過(guò)程是一組為了完成某項(xiàng)特定功能的SQL語(yǔ)句集, 其實(shí)質(zhì)就是一段存儲(chǔ)在數(shù)據(jù)庫(kù)中的代碼。 它可以由聲明式的sql語(yǔ)句和過(guò)程式sql語(yǔ)句組成。
特點(diǎn):
- 可增強(qiáng)SQL語(yǔ)言的功能和靈活性
- 良好的封裝性
- 高性能
- 可減少網(wǎng)絡(luò)流量
- 可作為一種安全機(jī)制來(lái)確保數(shù)據(jù)庫(kù)的安全性和數(shù)據(jù)的完整性
用戶定義的結(jié)束符(ELIMITER)
- ELIMITER $$:
- 例句:將MySQL結(jié)束符修改為兩個(gè)感嘆號(hào)“!!”? (DELIMITER !!)
使用CREATE PROCEDURE語(yǔ)句創(chuàng)建存儲(chǔ)過(guò)程:CREATE PROCEDURE sp_name([proc_parameter[,…]]) routine_body ;
proc_paramete:指定存儲(chǔ)過(guò)程的參數(shù)列表
routine_body:存儲(chǔ)過(guò)程的主體部分,也稱為存儲(chǔ)過(guò)程體
[IN | OUT | INOUT] param_name type:參數(shù)?名,參數(shù)類型
例如:在mysql_test中創(chuàng)建一個(gè)存儲(chǔ)過(guò)程,用于實(shí)現(xiàn)給定表customers中一個(gè)客戶id號(hào)即可修改表customers中該客戶的性別為一個(gè)指定的性別
?
?
?
使用DECLARE語(yǔ)句聲明局部變量:DECLARE var_name[,…] type [DEFAULT value]
例如:聲明一個(gè)整型局部變量cid:? ?DECLARE cid INT(10);
使用DECLARE語(yǔ)句聲明局部變量的規(guī)范
- 1)只能在存儲(chǔ)過(guò)程體的BEGIN…END語(yǔ)句塊中聲明;
- 2)必須在存儲(chǔ)過(guò)程的開(kāi)頭處聲明;
- 3)作用范圍僅限于聲明它的BEGIN…END語(yǔ)句塊;
- 4)不同于用戶變量
局部變量與用戶變量的區(qū)別:
- 1)局部變量聲明時(shí),在其前面沒(méi)有@符號(hào),并且它只能 被聲明它的BEGIN…END語(yǔ)句塊中的語(yǔ)句所使用;
- 2)用戶變量在聲明時(shí),會(huì)在其名稱前面使用@符號(hào),同 時(shí)已聲明的用戶變量存在于整個(gè)會(huì)話之中。
使用SET語(yǔ)句為局部變量賦值:SET var_name=expr[,var_name=expr]…? ? ? ? ? ? ? ??SET cid=910;
使用SELECT…INTO語(yǔ)句把選定列的值直接存儲(chǔ)到局部變量中
?
?
流程控制語(yǔ)句
- 1、條件判斷語(yǔ)句 IF…THEN …ELSE語(yǔ)句 CASE語(yǔ)句? ?(IF 條件 THEN 表達(dá)式1 ELSE 表達(dá)式2 END IF;)
- 2、循環(huán)語(yǔ)句 WHILE語(yǔ)句 REPEAT語(yǔ)句 LOOP語(yǔ)句
WHILE 條件 表達(dá)式 END WHILE
repeat 表達(dá)式 END repeat
loop 表達(dá)式 END loop
ITERATE語(yǔ)句 用于表示退出當(dāng)前循環(huán)
****************************游標(biāo)CURSOR*****************************************
使用DECLARE CURSOR語(yǔ)句創(chuàng)建游標(biāo)
?
?
?
使用OPEN語(yǔ)句打開(kāi)游標(biāo):OPEN cursor_name
使用FETCH…INTO語(yǔ)句讀取數(shù)據(jù):
?
?
?
使用CLOSE語(yǔ)句關(guān)閉游標(biāo) :CLOSE cursor_name
**********************存儲(chǔ)過(guò)程的使用************************
使用CALL語(yǔ)句調(diào)用存儲(chǔ)過(guò)程
?
?
?調(diào)用數(shù)據(jù)庫(kù)mysql_test中的存儲(chǔ)過(guò)程sp_update_sex,將客戶id號(hào)為909的客戶性別修改為男性“M”
CALL sp_update_sex(909,’M’);
使用DROP PROCEDURE語(yǔ)句刪除存儲(chǔ)過(guò)程
DROP PROCEDURE[IF EXISTS] sp_name
二、存儲(chǔ)函數(shù)
存儲(chǔ)函數(shù)與存儲(chǔ)過(guò)程一樣,是由SQL語(yǔ)句和過(guò)程式語(yǔ)句組成的代碼片段
使用CREATE FUNCTION語(yǔ)句創(chuàng)建存儲(chǔ)函數(shù)
CREATE FUNCTION sp_name([func_parameter[,…]]) RETURNS type routine_body
- sp_name:指定存儲(chǔ)函數(shù)的名稱
- func_parameter:指定存儲(chǔ)函數(shù)的參數(shù)
- RETURNS type :聲明存儲(chǔ)函數(shù)返回值的數(shù)據(jù)類型; type指定返回值的數(shù)據(jù)類型
- ?routine_body 指定存儲(chǔ)函數(shù)的主體部分,也稱為存儲(chǔ)函數(shù)體
在數(shù)據(jù)庫(kù)mysql_test中創(chuàng)建 一個(gè)存儲(chǔ)函數(shù),要求該函數(shù)能根據(jù) 給定的客戶id號(hào)返回客戶的性別, 如果數(shù)據(jù)庫(kù)中沒(méi)有給定的客戶id號(hào) ,則返回“沒(méi)有該客戶”。
Use mysql_test; DELIMITER $$ CREATE FUNCTION fn_search(cid INT) RETURNS CHAR(20) DETERMINISTIC BEGIN DECLARE SEX CHAR(20); SELECT cust_sex INTO SEX FROM customersWHERE cust_id=cid; IF SEX IS NULL THEN RETURN(SELECT’沒(méi)有該客戶’); ELSE IF SEX=‘F’ THEN RETURN(SELECT’女’);ELSE RETURN(SELECT ‘男’);END IF;END IF; END $$?
?
?使用關(guān)鍵字SELECT調(diào)用存儲(chǔ)函數(shù):SELECT sp_name([func_parameter[, …]])
使用DROP FUNCTION語(yǔ)句刪除存儲(chǔ)函數(shù):DROP FUNCTION [IF EXISTS] sp_name
轉(zhuǎn)載于:https://www.cnblogs.com/jalja/p/11611440.html
總結(jié)
以上是生活随笔為你收集整理的数据库系统原理(第5章:数据库编程)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 数据库系统原理(第四章:SQL与关系数据
- 下一篇: 数据库系统原理(第6章:数据库安全与保护