存储过程与函数的区别
存儲過程與函數(shù)的區(qū)別
本質(zhì)上沒區(qū)別,執(zhí)行的本質(zhì)都一樣。
只是函數(shù)有如:只能返回一個變量的限制。而存儲過程可以返回多個。
函數(shù)是可以嵌入在sql中使用的,可以在select中調(diào)用,而存儲過程要讓sql的query 可以執(zhí)行, 需要把 mysql_real_connect 的最后一個參數(shù)設(shè)置為CLIENT_MULTI_STATEMENTS。
函數(shù)限制比較多,比如不能用臨時表,只能用表變量.還有一些函數(shù)都不可用等等.而存儲過程的限制相對就比較少。
特性區(qū)別如下:
1)一般來說,存儲過程實現(xiàn)的功能要復(fù)雜一點,而函數(shù)的實現(xiàn)的功能針對性比較強。存儲過程,功能強大,可以執(zhí)行包括修改表等一系列數(shù)據(jù)庫操作;用戶定義函數(shù)不能用于執(zhí)行一組修改全局?jǐn)?shù)據(jù)庫狀態(tài)的操作。
2)對于存儲過程來說可以返回參數(shù),如記錄集,而函數(shù)只能返回值或者表對象。函數(shù)只能返回一個變量;而存儲過程可以返回多個。存儲過程的參數(shù)可以有IN,OUT,INOUT三種類型,而函數(shù)只能有IN類~~存儲過程聲明時不需要返回類型,而函數(shù)聲明時需要描述返回類型,且函數(shù)體中必須包含一個有效的RETURN語句。
3)存儲過程,可以使用非確定函數(shù),不允許在用戶定義函數(shù)主體中內(nèi)置非確定函數(shù)。
4)存儲過程一般是作為一個獨立的部分來執(zhí)行( EXECUTE 語句執(zhí)行),而函數(shù)可以作為查詢語句的一個部分來調(diào)用(SELECT調(diào)用),由于函數(shù)可以返回一個表對象,因此它可以在查詢語句中位于FROM關(guān)鍵字的后面。 SQL語句中不可用存儲過程,而可以使用函數(shù)。
當(dāng)存儲過程和函數(shù)被執(zhí)行的時候,SQL Manager會到procedure cache中去取相應(yīng)的查詢語句,如果在procedure cache里沒有相應(yīng)的查詢語句,SQL Manager就會對存儲過程和函數(shù)進(jìn)行編譯。
Procedure cache中保存的是執(zhí)行計劃 (execution plan) ,當(dāng)編譯好之后就執(zhí)行procedure cache中的execution plan,之后SQL SERVER會根據(jù)每個execution plan的實際情況來考慮是否要在cache中保存這個plan,評判的標(biāo)準(zhǔn)一個是這個execution plan可能被使用的頻率;其次是生成這個plan的代價,也就是編譯的耗時。保存在cache中的plan在下次執(zhí)行時就不用再編譯了。
MYSql存儲過程的作用及語法
作用:
1、使用存過過程,很多相似性的刪除,更新,新增等操作就變得輕松了,并且以后也便于管理!
2、存儲過程因為SQL語句已經(jīng)預(yù)編繹過了,因此運行的速度比較快。
3、存儲過程可以接受參數(shù)、輸出參數(shù)、返回單個或多個結(jié)果集以及返回值。可以向程序返回錯誤原因。
4、存儲過程運行比較穩(wěn)定,不會有太多的錯誤。只要一次成功,以后都會按這個程序運行。
5、存儲過程主要是在服務(wù)器上運行,減少對客戶機的壓力。
6、存儲過程可以包含程序流、邏輯以及對數(shù)據(jù)庫的查詢。同時可以實體封裝和隱藏了數(shù)據(jù)邏輯。
7、存儲過程可以在單個存儲過程中執(zhí)行一系列SQL語句。
8、存儲過程可以從自己的存儲過程內(nèi)引用其它存儲過程,這可以簡化一系列復(fù)雜語句。
一、創(chuàng)建存儲過程
create procedure sp_name() begin ......... end- 1
- 2
- 3
- 4
- 1
- 2
- 3
- 4
二、調(diào)用存儲過程
call sp_name()- 1
- 1
注意:存儲過程名稱后面必須加括號,哪怕該存儲過程沒有參數(shù)傳遞
三、刪除存儲過程
drop procedure sp_name//- 1
- 1
注意:不能在一個存儲過程中刪除另一個存儲過程,只能調(diào)用另一個存儲過程
四、區(qū)塊,條件,循環(huán)
1、區(qū)塊定義,常用
- 1
- 2
- 3
- 1
- 2
- 3
也可以給區(qū)塊起別名,如:
lable:begin ........... end lable;- 1
- 2
- 3
- 1
- 2
- 3
可以用leave lable;跳出區(qū)塊,執(zhí)行區(qū)塊以后的代碼
2、條件語句
if 條件 then statement else statement end if;- 1
- 2
- 3
- 4
- 5
- 1
- 2
- 3
- 4
- 5
3、循環(huán)語句
(1)while循環(huán)
- 1
- 2
- 3
- 4
- 5
- 1
- 2
- 3
- 4
- 5
(2)、loop循環(huán)
[label:] LOOPstatementsEND LOOP [label];- 1
- 2
- 3
- 4
- 5
- 1
- 2
- 3
- 4
- 5
(3)、repeat until循環(huán)
[label:] REPEATstatementsUNTIL expressionEND REPEAT [label] ;- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 1
- 2
- 3
- 4
- 5
- 6
- 7
五、其他常用命令
1.show procedure status
顯示數(shù)據(jù)庫中所有存儲的存儲過程基本信息,包括所屬數(shù)據(jù)庫,存儲過程名稱,創(chuàng)建時間等
2.show create procedure sp_name
顯示某一個存儲過程的詳細(xì)信息
函數(shù)function示例
CREATE DEFINER=`root`@`%` FUNCTION `spr_checkadmin`(acckey varchar(32), accpwd varchar(64)) RETURNS int(11) BEGIN DECLARE x INT; SELECT COUNT(*) INTO x FROM admins WHERE account=acckey AND passwd=accpwd; RETURN(x); END;- 1
- 2
- 3
- 4
- 5
- 6
- 1
- 2
- 3
- 4
- 5
- 6
單個返回值的存儲過程
CREATE DEFINER=`root`@`%` PROCEDURE `spr_getuserstorage`(tok varchar(128)) BEGIN DECLARE acc VARCHAR(32); DECLARE pkgid VARCHAR(32); DECLARE regdate DATETIME; DECLARE logindate DATETIME; DECLARE sumsize BIGINT; SELECT account INTO acc FROM userinfo WHERE token=tok; IF (acc != NULL) THEN SELECT SUM(filesize) INTO sumsize FROM userfiles WHERE account=acc; SELECT packageid, registerdate, lastlogindate INTO pkgid, regdate, logindate FROM userinfo WHERE account=acc; SELECT 0,pkgid,regdate,logindate; ELSE SELECT(-1); END IF;- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
多個返回值存儲過程
CREATE DEFINER=`root`@`%` PROCEDURE `spr_queryfolderallfile`(sToken varchar(32), OUT sfid varchar(32), OUT sfext varchar(32)) BEGIN DECLARE acc CHAR(32); SELECT account INTO acc FROM userinfo WHERE token=sToken; IF (acc != NULL) THEN SELECT fileid, fileext INTO sfid, sfext FROM userfiles WHERE account=acc AND filetype=1; END IF; END;- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
總結(jié)
以上是生活随笔為你收集整理的存储过程与函数的区别的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Flex与JavaScript的交互:调
- 下一篇: wopihost