MySQL 的存储过程 procedure 与 函数 function 的区别和使用方法

存储过程与函数的区别
   
   
  1. 本质上没区别,执行的本质都一样。
  2. 只是函数有只能返回一个变量的限制。而存储过程可以返回多个。
  3.   
  4. 函数是可以嵌入在sql中使用的,可以在select中调用
  5. 而存储过程要让sqlquery 可以执行,需要把 mysql_real_connect 的最后一个参数设置为CLIENT_MULTI_STATEMENTS
  6. 函数限制比较多,比如不能用临时表,只能用表变量.还有一些函数都不可用等等.
  7. 而存储过程的限制相对就比较少。

   
特性区别如下: 

  
  
  1. 1)一般来说,存储过程实现的功能要复杂一点,而函数的实现的功能针对性比较强。
  2. 存储过程,功能强大,可以执行包括修改表等一系列数据库操作;
  3. 用户定义函数不能用于执行一组修改全局数据库状态的操作。
  4.  
  5. 2)对于存储过程来说可以返回参数,如记录集,而函数只能返回值或者表对象。
  6. 函数只能返回一个变量;而存储过程可以返回多个。
  7. 存储过程的参数可以有IN,OUT,INOUT三种类型,而函数只能有IN类~~存储过程声明时不需要返回类型,
  8. 而函数声明时需要描述返回类型,且函数体中必须包含一个有效的RETURN语句。
          
          
    1. 那么总结如下:
    2. IN参数:
    3. 仅需要将数据传入存储过程,并不需要返回计算后的该值。
    4. OUT参数:
    5. 不接受外部传入的数据,仅返回计算之后的值。
    6. INOUT参数:
    7. 需要数据传入存储过程经过调用计算后,再传出返回值。

  9. 3)存储过程,可以使用非确定函数,不允许在用户定义函数主体中内置非确定函数。
  10. 4存储过程一般是作为一个独立的部分来执行( EXECUTE 语句执行)
  11. 函数可以作为查询语句的一个部分来调用(SELECT调用)
  12. 由于函数可以返回一个表对象,因此它可以在查询语句中位于FROM关键字的后面。 
  13. SQL语句中不可用存储过程,而可以使用函数。
   
   
  1. 当存储过程和函数被执行的时候,SQL Manager会到procedure cache中去取相应的查询语句,
  2. 如果在procedure cache里没有相应的查询语句,SQL Manager就会对存储过程和函数进行编译。
  3. Procedure cache中保存的是执行计划 (execution plan)
  4. 当编译好之后就执行procedure cache中的execution plan
  5. 之后SQL SERVER会根据每个execution plan的实际情况来考虑是否要在cache中保存这个plan
  6. 评判的标准一个是这个execution plan可能被使用的频率;
  7. 其次是生成这个plan的代价,也就是编译的耗时。
  8. 保存在cache中的plan在下次执行时就不用再编译了。

MYSql存储过程的作用及语法

作用: 

  
  
  1. 使用存储过程,很多相似性的删除,更新,新增等操作就变得轻松了,并且以后也便于管理!
  2. 存储过程--因为SQL语句已经预编绎过了,因此运行的速度比较快。
  3. 存储过程--可以接受参数、输出参数、返回单个或多个结果集以及返回值。可以向程序返回错误原因。
  4. 存储过程--运行比较稳定,不会有太多的错误。只要一次成功,以后都会按这个程序运行。
  5. 存储过程--主要是在服务器上运行,减少对客户机的压力
  6. 存储过程--可以包含程序流、逻辑以及对数据库的查询。同时可以实体封装和隐藏了数据逻辑。
  7. 存储过程--可以在单个存储过程中执行一系列SQL语句
  8. 存储过程--可以从自己的存储过程内引用其它存储过程,这可以简化一系列复杂语句。

一、创建存储过程

  
  
  1. create procedure sp_name()
  2. begin
  3. .........
  4. end

二、调用存储过程

  
  
  1. call sp_name()

注意:存储过程名称后面必须加括号,哪怕该存储过程没有参数传递

三、删除存储过程

  
  
  1. drop procedure sp_name//

注意:不能在一个存储过程中删除另一个存储过程,只能调用另一个存储过程

四、区块,条件,循环 
1、区块定义,常用

  
  
  1. begin
  2. ......
  3. end;

也可以给区块起别名,如:

  
  
  1. lable:begin
  2. ...........
  3. end lable;

可以用leave lable; 跳出区块,执行区块以后的代码

2、条件语句

  
  
  1. if 条件 then
  2. statement
  3. else
  4. statement
  5. end if;

3、循环语句 

(1)while循环

  
  
  1. [label:] WHILE expression DO
  2. statements
  3. END WHILE [label] ;

(2)、loop循环

  
  
  1. [label:] LOOP
  2. statements
  3. END LOOP [label];

(3)、repeat until循环

  
  
  1. [label:] REPEAT
  2. statements
  3. UNTIL expression
  4. END REPEAT [label] ;

五、其他常用命令 

1.show procedure status 

  • 显示数据库中所有存储的存储过程基本信息,包括所属数据库,存储过程名称,创建时间等 
2.show create procedure sp_name 
  • 显示某一个存储过程的详细信息

函数function示例

  
  
  1. CREATE DEFINER=`root`@`%` FUNCTION `spr_checkadmin`(acckey varchar(32), accpwd varchar(64)) RETURNS int(11)
  2. BEGIN
  3. DECLARE x INT;
  4. SELECT COUNT(*) INTO x FROM admins WHERE account=acckey AND passwd=accpwd;
  5. RETURN(x);
  6. END;

单个返回值的存储过程

  
  
  1. CREATE DEFINER=`root`@`%` PROCEDURE `spr_getuserstorage`(tok varchar(128))
  2. BEGIN
  3. DECLARE acc VARCHAR(32);
  4. DECLARE pkgid VARCHAR(32);
  5. DECLARE regdate DATETIME;
  6. DECLARE logindate DATETIME;
  7. DECLARE sumsize BIGINT;
  8. SELECT account INTO acc FROM userinfo WHERE token=tok;
  9. IF (acc != NULL) THEN
  10. SELECT SUM(filesize) INTO sumsize FROM userfiles WHERE account=acc;
  11. SELECT packageid, registerdate, lastlogindate INTO pkgid, regdate, logindate FROM userinfo WHERE account=acc;
  12. SELECT 0,pkgid,regdate,logindate;
  13. ELSE
  14. SELECT(-1);
  15. END IF;

多个返回值存储过程

  
  
  1. CREATE DEFINER=`root`@`%` PROCEDURE `spr_queryfolderallfile`(sToken varchar(32), OUT sfid varchar(32), OUT sfext varchar(32))
  2. BEGIN
  3. DECLARE acc CHAR(32);
  4. SELECT account INTO acc FROM userinfo WHERE token=sToken;
  5. IF (acc != NULL) THEN
  6. SELECT fileid, fileext INTO sfid, sfext FROM userfiles WHERE account=acc AND filetype=1;
  7. END IF;
  8. END;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值