Oracle中的函数与过程

svmlkihl  于 2022-12-26  发布在  Oracle
关注(0)|答案(7)|浏览(134)

Oracle中函数和过程的主要区别是什么?
如果我可以用函数做任何事情,为什么还要用过程呢?
1.如果我不能在sql语句中调用procedure,好吧,我会写一个函数来做同样的工作。
1.过程不返回值,好吧,我将在任何dml操作后只返回sql%rowcount或1(成功),0(异常
1.过程和函数都可以通过OUT/IN OUT参数将变量传递给调用环境
我听说主要的区别是在性能上,“* 过程比函数快 *",但没有任何支持细节。

4xy9mtcn

4xy9mtcn1#

不同之处在于-函数必须在默认定义下返回一个值(任何类型),而对于过程,您需要使用OUTIN OUT参数来获得结果。您可以在普通SQL中使用函数,而不能在SQL语句中使用过程。
函数和过程之间的一些区别
1.函数始终使用return语句返回值,而过程可以通过参数返回一个或多个值,也可以根本不返回。虽然OUT参数仍可以在函数中使用,但不建议在某些情况下使用,也不建议在某些情况下使用。使用OUT参数会限制函数在SQL语句中使用。
1.函数可以在SELECTINSERTUPDATEDELETEMERGE等典型SQL语句中使用,而过程则不能。
1.函数通常用于计算,而过程通常用于执行业务逻辑。

  1. Oracle提供了创建“Function Based Indexes“以提高后续SQL语句性能的规定,这适用于在查询的where子句中对索引列执行该函数时。
    有关函数与过程herehere的详细信息。
stszievb

stszievb2#

过程和函数之间几乎没有性能差异。
在少数极其罕见的情况下:

  • 启用内联时,过程IN OUT参数比函数返回速度快。
  • 禁用内联时,过程IN OUT参数比函数返回慢。
    • 测试代码**
--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

上面的代码很简单,可能需要进行其他优化,但我在生产代码中看到过类似的结果。

    • 为何差异无关紧要**

不要在看上面的测试时就认为"一个过程比一个函数运行得快两倍!"是的,一个函数的开销几乎是一个过程开销的两倍。但是不管怎样,开销都是微不足道的。
数据库性能的关键是在SQL语句中成批地做尽可能多的工作。如果一个程序每秒调用一个函数或过程一千万次,那么这个程序就有严重的设计问题。

ljsrvy3e

ljsrvy3e3#

状态更改与非状态更改

除了Romo Daneghyan's answer之外,我一直认为它们在程序状态上的行为不同,也就是说,* 概念上 *,

  • 程序可以改变某些状态,无论是参数还是环境(例如,表格中的数据等)。
  • 函数不改变状态,并且您可能期望调用特定函数不会修改任何数据/状态(即functional programming的基本概念)。

例如,如果你调用了一个名为generateId(...)的函数,你会期望它只做一些计算并返回一个值,但是调用一个过程generateId ...,你可能期望它改变一些表中的值。
当然,在Oracle以及许多语言中,这似乎并不适用,也没有强制执行,所以可能只是我。

3zwtqj6y

3zwtqj6y4#

1.过程可能返回值,也可能不返回值,但函数返回值。
1.程序使用了参数返回值,但函数返回语句提供。
1.程序使用数据操作,而函数使用数据计算。
1.过程执行时间不使用select语句,而函数使用select语句,这是两者的主要区别。

twh00eeo

twh00eeo5#

这是一个很好的问题,但据我所知,这个问题还没有得到真正的回答。问题不是“函数和过程之间的区别是什么?”而是“当我可以用函数做同样的事情时,我为什么还要用过程?”
我认为真实的的答案是**“这只是惯例。"**因为这是惯例,这是其他开发人员所习惯和期望的,所以你应该遵循惯例。但是,将子程序编写为函数上的过程没有任何功能上的原因。一个例外可能是当有多个OUT参数时。
Steven Feuerstein在他的6th edition of Oracle PL/SQL Programming中建议为过程保留OUTIN OUT参数,并且只通过RETURN子句返回函数中的信息(p.613),但这也是惯例,开发人员不希望函数有OUT参数。
我写过一个longish post here,它主张只有在函数不能完成任务时才应该使用过程,我个人更喜欢函数,希望约定是默认使用函数,但我认为更好的做法是 * 接受我不能改变的东西 *,服从实际的约定,而不是我希望的约定。

x3naxklr

x3naxklr6#

我觉得最大的分别是:
函数不能包含DML语句,而过程可以,例如Update和Insert。
如果我错了请纠正我

kiayqfof

kiayqfof7#

据我所知,存储过程是编译一次的,可以反复调用而不需要再编译。但是函数每次调用都要编译。所以,存储过程比函数提高了性能。

相关问题