--Run one of these to set optimization level:
--alter session set plsql_optimize_level=0;
--alter session set plsql_optimize_level=1;
--alter session set plsql_optimize_level=2;
--alter session set plsql_optimize_level=3;
--Run this to compare times. Move the comment to enable the procedure or the function.
declare
v_result varchar2(4000);
procedure test_procedure(p_result in out varchar2) is
begin
p_result := '0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789';
end;
function test_function return varchar2 is
begin
return '0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789';
end;
begin
for i in 1 .. 10000000 loop
--Comment out one of these lines to change the test.
--test_procedure(v_result);
v_result := test_function;
end loop;
end;
/
结果**
Inlining enabled: PLSQL_OPTIMIZE_LEVEL = 2 (default) or 3
Function run time in seconds: 2.839, 2.933, 2.979
Procedure run time in seconds: 1.685, 1.700, 1.762
Inlining disabled: PLSQL_OPTIMIZE_LEVEL = 0 or 1
Function run time in seconds: 5.164, 4.967, 5.632
Procedure run time in seconds: 6.1, 6.006, 6.037
7条答案
按热度按时间4xy9mtcn1#
不同之处在于-函数必须在默认定义下返回一个值(任何类型),而对于过程,您需要使用
OUT
或IN OUT
参数来获得结果。您可以在普通SQL
中使用函数,而不能在SQL
语句中使用过程。函数和过程之间的一些区别
1.函数始终使用return语句返回值,而过程可以通过参数返回一个或多个值,也可以根本不返回。虽然
OUT
参数仍可以在函数中使用,但不建议在某些情况下使用,也不建议在某些情况下使用。使用OUT
参数会限制函数在SQL语句中使用。1.函数可以在
SELECT
、INSERT
、UPDATE
、DELETE
、MERGE
等典型SQL语句中使用,而过程则不能。1.函数通常用于计算,而过程通常用于执行业务逻辑。
有关函数与过程here和here的详细信息。
stszievb2#
过程和函数之间几乎没有性能差异。
在少数极其罕见的情况下:
IN OUT
参数比函数返回速度快。IN OUT
参数比函数返回慢。上面的代码很简单,可能需要进行其他优化,但我在生产代码中看到过类似的结果。
不要在看上面的测试时就认为"一个过程比一个函数运行得快两倍!"是的,一个函数的开销几乎是一个过程开销的两倍。但是不管怎样,开销都是微不足道的。
数据库性能的关键是在SQL语句中成批地做尽可能多的工作。如果一个程序每秒调用一个函数或过程一千万次,那么这个程序就有严重的设计问题。
ljsrvy3e3#
状态更改与非状态更改
除了Romo Daneghyan's answer之外,我一直认为它们在程序状态上的行为不同,也就是说,* 概念上 *,
例如,如果你调用了一个名为
generateId(...)
的函数,你会期望它只做一些计算并返回一个值,但是调用一个过程generateId ...
,你可能期望它改变一些表中的值。当然,在Oracle以及许多语言中,这似乎并不适用,也没有强制执行,所以可能只是我。
3zwtqj6y4#
1.过程可能返回值,也可能不返回值,但函数返回值。
1.程序使用了参数返回值,但函数返回语句提供。
1.程序使用数据操作,而函数使用数据计算。
1.过程执行时间不使用select语句,而函数使用select语句,这是两者的主要区别。
twh00eeo5#
这是一个很好的问题,但据我所知,这个问题还没有得到真正的回答。问题不是“函数和过程之间的区别是什么?”而是“当我可以用函数做同样的事情时,我为什么还要用过程?”
我认为真实的的答案是**“这只是惯例。"**因为这是惯例,这是其他开发人员所习惯和期望的,所以你应该遵循惯例。但是,将子程序编写为函数上的过程没有任何功能上的原因。一个例外可能是当有多个
OUT
参数时。Steven Feuerstein在他的6th edition of Oracle PL/SQL Programming中建议为过程保留
OUT
和IN OUT
参数,并且只通过RETURN子句返回函数中的信息(p.613),但这也是惯例,开发人员不希望函数有OUT
参数。我写过一个longish post here,它主张只有在函数不能完成任务时才应该使用过程,我个人更喜欢函数,希望约定是默认使用函数,但我认为更好的做法是 * 接受我不能改变的东西 *,服从实际的约定,而不是我希望的约定。
x3naxklr6#
我觉得最大的分别是:
函数不能包含DML语句,而过程可以,例如Update和Insert。
如果我错了请纠正我
kiayqfof7#
据我所知,存储过程是编译一次的,可以反复调用而不需要再编译。但是函数每次调用都要编译。所以,存储过程比函数提高了性能。