存储过程与函数的区别
存儲過程與函數的區別
  本質上沒區別,執行的本質都一樣。 
   只是函數有如:只能返回一個變量的限制。而存儲過程可以返回多個。   
   函數是可以嵌入在sql中使用的,可以在select中調用,而存儲過程要讓sql的query 可以執行, 需要把 mysql_real_connect 的最后一個參數設置為CLIENT_MULTI_STATEMENTS。 
   函數限制比較多,比如不能用臨時表,只能用表變量.還有一些函數都不可用等等.而存儲過程的限制相對就比較少。 
    
   特性區別如下: 
   
   1)一般來說,存儲過程實現的功能要復雜一點,而函數的實現的功能針對性比較強。存儲過程,功能強大,可以執行包括修改表等一系列數據庫操作;用戶定義函數不能用于執行一組修改全局數據庫狀態的操作。 
   
   2)對于存儲過程來說可以返回參數,如記錄集,而函數只能返回值或者表對象。函數只能返回一個變量;而存儲過程可以返回多個。存儲過程的參數可以有IN,OUT,INOUT三種類型,而函數只能有IN類~~存儲過程聲明時不需要返回類型,而函數聲明時需要描述返回類型,且函數體中必須包含一個有效的RETURN語句。 
3)存儲過程,可以使用非確定函數,不允許在用戶定義函數主體中內置非確定函數。
  4)存儲過程一般是作為一個獨立的部分來執行( EXECUTE 語句執行),而函數可以作為查詢語句的一個部分來調用(SELECT調用),由于函數可以返回一個表對象,因此它可以在查詢語句中位于FROM關鍵字的后面。 SQL語句中不可用存儲過程,而可以使用函數。 
    
   當存儲過程和函數被執行的時候,SQL Manager會到procedure cache中去取相應的查詢語句,如果在procedure cache里沒有相應的查詢語句,SQL Manager就會對存儲過程和函數進行編譯。 
   Procedure cache中保存的是執行計劃 (execution plan) ,當編譯好之后就執行procedure cache中的execution plan,之后SQL SERVER會根據每個execution plan的實際情況來考慮是否要在cache中保存這個plan,評判的標準一個是這個execution plan可能被使用的頻率;其次是生成這個plan的代價,也就是編譯的耗時。保存在cache中的plan在下次執行時就不用再編譯了。
MYSql存儲過程的作用及語法
作用: 
   1、使用存過過程,很多相似性的刪除,更新,新增等操作就變得輕松了,并且以后也便于管理! 
   2、存儲過程因為SQL語句已經預編繹過了,因此運行的速度比較快。 
   3、存儲過程可以接受參數、輸出參數、返回單個或多個結果集以及返回值。可以向程序返回錯誤原因。 
   4、存儲過程運行比較穩定,不會有太多的錯誤。只要一次成功,以后都會按這個程序運行。 
   5、存儲過程主要是在服務器上運行,減少對客戶機的壓力。 
   6、存儲過程可以包含程序流、邏輯以及對數據庫的查詢。同時可以實體封裝和隱藏了數據邏輯。 
   7、存儲過程可以在單個存儲過程中執行一系列SQL語句。 
   8、存儲過程可以從自己的存儲過程內引用其它存儲過程,這可以簡化一系列復雜語句。
一、創建存儲過程
create procedure sp_name() begin ......... end- 1
- 2
- 3
- 4
- 1
- 2
- 3
- 4
二、調用存儲過程
call sp_name()- 1
- 1
注意:存儲過程名稱后面必須加括號,哪怕該存儲過程沒有參數傳遞
三、刪除存儲過程
drop procedure sp_name//- 1
- 1
注意:不能在一個存儲過程中刪除另一個存儲過程,只能調用另一個存儲過程
四、區塊,條件,循環 
 1、區塊定義,常用
- 1
- 2
- 3
- 1
- 2
- 3
也可以給區塊起別名,如:
lable:begin ........... end lable;- 1
- 2
- 3
- 1
- 2
- 3
可以用leave lable;跳出區塊,執行區塊以后的代碼
2、條件語句
if 條件 then statement else statement end if;- 1
- 2
- 3
- 4
- 5
- 1
- 2
- 3
- 4
- 5
3、循環語句 
 (1)while循環
- 1
- 2
- 3
- 4
- 5
- 1
- 2
- 3
- 4
- 5
(2)、loop循環
[label:] LOOPstatementsEND LOOP [label];- 1
- 2
- 3
- 4
- 5
- 1
- 2
- 3
- 4
- 5
(3)、repeat until循環
[label:] REPEATstatementsUNTIL expressionEND REPEAT [label] ;- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 1
- 2
- 3
- 4
- 5
- 6
- 7
五、其他常用命令 
 1.show procedure status 
 顯示數據庫中所有存儲的存儲過程基本信息,包括所屬數據庫,存儲過程名稱,創建時間等 
 2.show create procedure sp_name 
 顯示某一個存儲過程的詳細信息
函數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
總結
以上是生活随笔為你收集整理的存储过程与函数的区别的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: Flex与JavaScript的交互:调
- 下一篇: wopihost
