Mysql 的 function 和 procedure 有啥区别呢 ? 网上搜索后说 function 有返回值, procedure 无返回值。
1.return
从function 的语法角度来说确实如此, function 的定义中有 return 一项,如下所示
procedure:
DROP PROCEDURE IF EXISTS `p_query_user` ; DELIMITER // CREATE PROCEDURE p_query_user() begin declare c varchar(100) default '0'; select 1111 ; end // DELIMITER ; CALL p_query_user();
function:
DROP FUNCTION IF EXISTS `f_query_user` ; DELIMITER // CREATE FUNCTION f_query_user() RETURNS varchar(100) CHARSET gbk begin declare c varchar(100) default '0'; select 1111 INTO c; RETURN c; end // DELIMITER ; SELECT f_query_user();
2.select
- 在 procedure 可以有 select 1111 ;
- 在 function 中不能有 select 1111 ;
3.调用
procedure 用 call 可以调用
CALL p_query_user();
function 用 select 调用.
SELECT f_query_user();
4.参数带默认值
procedure 不支持defualt值,可以改成set或者内部定义变量加上 defualt关键字
function 不支持defualt值,可以改成set或者内部定义变量加上 defualt关键字
3. 让我来简单的说PROCEDURE可以返回值,也可以做一件事,比如几个TABLE之间的数据转来转去,而FUNCTION一定要有返回值,还只能返回一个.....
4.三点与存储过程不同的地方:
a,必须要一个RETURNS语句来定义返回值类型
b,不能指定参数的IN、OUT或INOUT修饰符,所有参数隐式的为IN
c,Function体必须包含RETURN语句来终结Function执行并返回指定的结果给调用者
2.考虑是使用函数还是使用存储过程可以根据以下方面:
从参数的返回情况来看:如果返回多个参数值最好使用存储过程,如果只有一个返回值的话可以使用函数;
从调用情况来看:
(1)如果在SQL语句(DML或SELECT)中调用的话一定是存储函数或存储的封装函数不可以是存储过程,但调用存储函数的时候还有好多限制以及函数的纯度等级的问题,你可以参考《ORACLE 9I PLSQL程序设计》(机械工业出版社);
(2)如果是在过程化语句中调用的话,就要看你要实现什么样的功能。函数一般情况下是用来计算并返回一个计算结果而存储过程一般是用来完成特定的数据操作(比如修改、插入数据库表或执行某些DDL语句等等),所以虽然他们的语法上很相似但用户在使用他们的时候所需要完成的功能大部分情况下是不同的。