Ano*_*nym 151 mysql stored-procedures sql-function
我在看MySQL存储过程和函数.真正的区别是什么?
它们似乎相似,但功能有更多限制.
我可能错了,但似乎存储过程可以做所有事情,而存储功能可以做得更多.为什么/何时使用程序与函数?
Gri*_*han 250
程序和函数之间最普遍的区别在于它们的调用方式不同,并且用于不同的目的:
例程创建的语法在某些程序和函数上有所不同:
函数返回值,因此函数定义中必须有RETURNS子句来指示返回值的数据类型.此外,函数体中必须至少有一个RETURN语句才能将值返回给调用者.RETURNS和RETURN不会出现在过程定义中.
要调用存储过程,请使用CALL statement.要调用存储的函数,请在表达式中引用它.该函数在表达式求值期间返回一个值.
使用CALL语句调用过程,并且只能使用输出变量传回值.可以从语句内部调用函数,就像任何其他函数一样(即通过调用函数的名称),并且可以返回标量值.
将参数指定为IN,OUT或INOUT仅对PROCEDURE有效.对于FUNCTION,参数始终被视为IN参数.
如果在参数名称之前没有给出关键字,则默认情况下它是IN参数. 存储函数的参数前面没有IN,OUT或INOUT.所有函数参数都被视为IN参数.
要定义存储过程或函数,请分别使用CREATE PROCEDURE或CREATE FUNCTION:
CREATE PROCEDURE proc_name ([parameters])
[characteristics]
routine_body
CREATE FUNCTION func_name ([parameters])
RETURNS data_type // diffrent
[characteristics]
routine_body
Run Code Online (Sandbox Code Playgroud)
存储过程(不是函数)的MySQL扩展是一个过程可以生成结果集,甚至是多个结果集,调用者以与SELECT语句的结果相同的方式处理它们.但是,此类结果集的内容不能直接用于表达式.
存储例程(指存储过程和存储函数)与特定数据库相关联,就像表或视图一样.删除数据库时,数据库中的所有存储例程也将被删除.
存储过程和函数不共享相同的命名空间.可以在数据库中具有相同名称的过程和函数.
在存储过程中,可以使用动态SQL,但不能在函数或触发器中使用.
SQL预处理语句(PREPARE,EXECUTE,DEALLOCATE PREPARE)可用于存储过程,但不能用于存储的函数或触发器.因此,存储的函数和触发器不能使用动态SQL(将语句构造为字符串然后执行它们).(MySQL存储例程中的动态SQL)
FUNCTION和STORED PROCEDURE之间有一些更有趣的区别:
(这一点是从博客帖子中复制的.)存储过程是预编译的执行计划,而不是函数.函数在运行时解析和编译.存储过程,存储为数据库中的伪代码,即编译形式.
(我不确定这一点.)
存储过程具有安全性并减少网络流量,我们也可以在任何编号中调用存储过程.一次申请.参考
函数通常用于计算,其中过程通常用于执行业务逻辑.
函数不能影响数据库的状态(在函数中不允许显式或隐式提交或回滚的语句)而存储过程可以使用提交等来影响数据库的状态.
参考:J.1.存储例程和触发器的限制
函数不能使用FLUSH语句,而存储过程可以使用.
存储的函数不能递归,而存储过程可以.注意:默认情况下禁用递归存储过程,但可以通过将max_sp_recursion_depth服务器系统变量设置为非零值在服务器上启用.有关更多信息,请参见第5.2.3节"系统变量".
在存储的函数或触发器中,不允许通过调用函数或触发器的语句修改已经使用(用于读取或写入)的表.好例子:如何在MYSQL中删除相同的表格?
注意:尽管某些限制通常适用于存储的函数和触发器,但不适用于存储过程,但如果从存储的函数或触发器中调用存储过程,则这些限制适用于存储过程.例如,虽然您可以在存储过程中使用FLUSH,但是无法从存储的函数或触发器调用此类存储过程.
nos*_*nos 92
您不能将存储过程与普通SQL混合使用,而使用存储功能则可以.
例如,SELECT get_foo(myColumn) FROM mytable如果get_foo()是一个程序则无效,但如果get_foo()是一个函数,你可以这样做.价格是功能比程序有更多限制.
Dan*_*llo 50
一个显着的区别是您可以在SQL查询中包含一个函数,但只能使用以下语句调用存储过程CALL:
UDF示例:
CREATE FUNCTION hello (s CHAR(20))
RETURNS CHAR(50) DETERMINISTIC
RETURN CONCAT('Hello, ',s,'!');
Query OK, 0 rows affected (0.00 sec)
CREATE TABLE names (id int, name varchar(20));
INSERT INTO names VALUES (1, 'Bob');
INSERT INTO names VALUES (2, 'John');
INSERT INTO names VALUES (3, 'Paul');
SELECT hello(name) FROM names;
+--------------+
| hello(name) |
+--------------+
| Hello, Bob! |
| Hello, John! |
| Hello, Paul! |
+--------------+
3 rows in set (0.00 sec)
Run Code Online (Sandbox Code Playgroud)
Sproc示例:
delimiter //
CREATE PROCEDURE simpleproc (IN s CHAR(100))
BEGIN
SELECT CONCAT('Hello, ', s, '!');
END//
Query OK, 0 rows affected (0.00 sec)
delimiter ;
CALL simpleproc('World');
+---------------------------+
| CONCAT('Hello, ', s, '!') |
+---------------------------+
| Hello, World! |
+---------------------------+
1 row in set (0.00 sec)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
94218 次 |
| 最近记录: |