網(wǎng)站建設(shè)優(yōu)化推廣教程今日新聞大事件
存儲(chǔ)過程
存儲(chǔ)過程是事先經(jīng)過編譯并存儲(chǔ)在數(shù)據(jù)庫(kù)中的一段 SQL 語(yǔ)句的集合,調(diào)用存儲(chǔ)過程可以簡(jiǎn)化應(yīng)用開發(fā)人員的很多工作,減少數(shù)據(jù)在數(shù)據(jù)庫(kù)和應(yīng)用服務(wù)器之間的傳輸,對(duì)于提高數(shù)據(jù)處理的效率是有好處的。存儲(chǔ)過程思想上很簡(jiǎn)單,就是數(shù)據(jù)庫(kù) SQL 語(yǔ)言層面的代碼封裝與重用
- 封裝,復(fù)用,?可以把某一業(yè)務(wù)SQL封裝在存儲(chǔ)過程中,需要用到的時(shí)候直接調(diào)用即可。
- 可以接收參數(shù),也可以返回?cái)?shù)據(jù),再存儲(chǔ)過程中,可以傳遞參數(shù),也可以接收返回值。
- 減少網(wǎng)絡(luò)交互,效率提升,如果涉及到多條SQL,每執(zhí)行一次都是一次網(wǎng)絡(luò)傳輸。 而如果封裝在存儲(chǔ)過程中,我們只需要網(wǎng)絡(luò)交互一次可能就可以了。
基本語(yǔ)法
創(chuàng)建
CREATE PROCEDURE 存儲(chǔ)過程名稱 ([ 參數(shù)列表 ])BEGIN-- SQL 語(yǔ)句END ;
-- 創(chuàng)建DELIMITER $ #將語(yǔ)句的結(jié)束符號(hào)從分號(hào);臨時(shí)改為兩個(gè)$(可以是自定義)CREATE PROCEDURE p1()
BEGINselect count(*) from stu;
END $DELIMITER ; #將語(yǔ)句的結(jié)束符號(hào)恢復(fù)為分號(hào)
調(diào)用
call p1();
查看
show create procedure p1;
刪除
drop procedure if exists p1;
帶參數(shù)?
MySQL存儲(chǔ)過程的參數(shù)用在存儲(chǔ)過程的定義,共有三種參數(shù)類型,IN,OUT,INOUT,形式
- IN 輸入?yún)?shù):表示調(diào)用者向過程傳入值(傳入值可以是字面量或變量)
- OUT 輸出參數(shù):表示過程向調(diào)用者傳出值(可以返回多個(gè)值)(傳出值只能是變量)
- INOUT 輸入輸出參數(shù):既表示調(diào)用者向過程傳入值,又表示過程向調(diào)用者傳出值(值只能是變量)
in類型
DELIMITER $CREATE PROCEDURE p2(in myid int)
BEGINselect * from stu where id=myid;
END $DELIMITER ;
調(diào)用call p2(1);
char類型的參數(shù)
DELIMITER $CREATE PROCEDURE p2(in myname VARCHAR(255))
BEGINset @sql = 'select * from stu where name = ?'; -- 拼接查詢總記錄的SQL語(yǔ)句 prepare stmt from @sql; -- 預(yù)定義一個(gè)語(yǔ)句,并將它賦給 stmtset @a=myname;execute stmt using @a; -- 執(zhí)行語(yǔ)句帶參數(shù),有其他參數(shù)加,分開deallocate prepare stmt;-- 要釋放一個(gè)預(yù)定義語(yǔ)句的資源
END $DELIMITER ;
?調(diào)用
out類型
DELIMITER $CREATE PROCEDURE p3(out result int)
BEGINset result=1;
END $DELIMITER ;
調(diào)用,傳入一個(gè)無初始化的變量
結(jié)果?
inout類型
DELIMITER $CREATE PROCEDURE p4(inout result int)
BEGINset result:=result+1;
END $DELIMITER ;
調(diào)用,傳入一個(gè)初始化的變量result,查看輸出結(jié)果result
存儲(chǔ)函數(shù)
存儲(chǔ)函數(shù)是有返回值的存儲(chǔ)過程,存儲(chǔ)函數(shù)的參數(shù)只能是IN類型的。具體語(yǔ)法如下
CREATE FUNCTION 存儲(chǔ)函數(shù)名稱 ([ 參數(shù)列表 ])
RETURNS type [characteristic ...]
BEGIN-- SQL語(yǔ)句RETURN ...;
END ;
?characteristic說明
- DETERMINISTIC:相同的輸入?yún)?shù)總是產(chǎn)生相同的結(jié)果
- NO SQL :不包含 SQL 語(yǔ)句。
- READS SQL DATA:包含讀取數(shù)據(jù)的語(yǔ)句,但不包含寫入數(shù)據(jù)的語(yǔ)句。
DETERMINISTIC的存儲(chǔ)過程
create function fun1(n int)
returns int deterministicbegindeclare total int default 0;while n>0 doset total := total + n;set n := n - 1;end while;return total;end;
select fun1(50);
READS SQL DATA的存儲(chǔ)過程
create function fun2(id int(5))
returns varchar(50) reads sql data
beginDECLARE result VARCHAR(250);set result=CONCAT('SELECT * FROM stu WHERE stu.id=', id);return result;
end;select fun2(1)
NO SQL的存儲(chǔ)過程?
CREATE FUNCTION fun3()
RETURNS VARCHAR(50) NO SQL
BEGINDECLARE result VARCHAR(50);SET result = 'Function';RETURN result;
END;
select fun3()