PL/SQL中的函数和过程有什么区别?

75

PL/SQL中函数和过程的区别是什么?


15
我不同意这被视为重复。一般来说,编程语言术语如“procedure”和“function”在数据库系统中的用法不同。这是一个好问题,只是答案是“与编程语言相同:请参见<其他问题>”。 - John Saunders
1
有人有自 Oracle 11g 开始的差异列表吗?我认为现在我们可以在函数中使用某些额外功能! - MozenRath
7个回答

55
一个过程没有返回值,而函数有返回值。
例如:
CREATE OR REPLACE PROCEDURE my_proc
   (p_name IN VARCHAR2 := 'John') as begin ... end

CREATE OR REPLACE FUNCTION my_func
   (p_name IN VARCHAR2 := 'John') return varchar2 as begin ... end

注意函数在参数列表和 "as" 关键字之间有一个返回语句。这意味着预期在函数体中的最后一个语句应该类似于:

return(my_varchar2_local_variable);

my_varchar2_local_variable是一个varchar2变量,该函数应该返回它。


16
稍作说明,你仍然可以从一个过程中获取OUT值——实际上,你可以为每个指定的OUT参数设置一个返回值。 - GoingTharn

19

函数可以内联到SQL语句中,例如:

select foo
      ,fn_bar (foo)
  from foobar

使用存储过程无法完成此操作。查询优化器的架构限制了在函数中可以执行的内容,在这种情况下,函数必须是纯的(即相同的输入始终产生相同的输出)。这限制了函数可以执行的内容,但允许在定义为“纯”的情况下在查询中内联使用。

否则,一个函数(不一定是确定性的)可以返回一个变量或结果集。如果函数返回结果集,则可以将其与查询中的其他选择连接。然而,你不能在相关子查询中使用此类非确定性函数,因为优化器无法预测将返回什么样的结果集(这像停机问题一样计算上难以解决)。


可能听起来有些不合理,但优化器并不会阻止您在任何地方使用非确定性函数。 - Jon Heller

2

简单来说,它的意思是:

函数 :

这些子程序返回一个单一值;主要用于计算和返回一个值。

过程 :

这些子程序不会直接返回一个值;主要用于执行一个操作。

示例程序:

CREATE OR REPLACE PROCEDURE greetings

BEGIN 

dbms_output.put_line('Hello World!');

END ;
/

执行独立过程:

独立过程有两种调用方式:

• 使用 EXECUTE 关键字 • 从 PL/SQL 块中调用过程名称

该过程还可以从另一个 PL/SQL 块中调用:

BEGIN 
greetings;
END;
/

功能:

CREATE OR REPLACE FUNCTION totalEmployees 
RETURN number IS
total number(3) := 0;
BEGIN 
SELECT count(*) into total 
FROM employees;
RETURN total; 
END;
/

下面的程序从另一个块中调用了函数totalCustomers
DECLARE 
c number(3);
BEGIN 
c := totalEmployees();
dbms_output.put_line('Total no. of Employees: ' || c);
END;
/

2

存储过程和函数都是命名块,驻留在数据库中,可以随时执行。

主要区别如下:

  1. 存储过程可以选择使用输出参数返回值,但也可以以不返回值的方式编写。但是,函数必须返回一个值。

  2. 存储过程不能用于SELECT语句,而函数可以用于SELECT语句。

实际上,对于特定的一组需求,我会选择存储过程,对于可在多个场景中共享的常见需求,我会选择函数。例如:比较两个字符串、修剪它们或取最后一部分,如果我们有一个函数,我们可以全局地将其用于任何应用程序。


0
简单来说,函数会返回一个结果。在SQL查询中可以使用函数。 而存储过程是用于处理数据的一部分代码,但不能从查询中调用它,只能在PL/SQL块中运行。

0

下面是过程和函数之间的主要区别:

  1. 过程是命名的 PL/SQL 块,执行一个或多个任务。而函数是命名的 PL/SQL 块,执行特定的操作。
  2. 过程可能返回值,也可能不返回值,而函数应该返回一个值。
  3. 我们可以在 select 语句中调用函数,但不能调用过程。

4
一个函数能否执行多个“操作”?它只会_返回_数据类型。 - Ben

-1
  1. 我们可以在存储过程中调用另一个存储过程,函数中调用另一个函数,存储过程中调用函数,但是不能在函数中调用存储过程。
  2. 我们可以在select语句中调用函数。
  3. 我们可以从函数中返回值,而不需要将输出参数作为参数传递给存储过程。

这就是我发现的区别,请告诉我是否有任何问题。


1
你是错误的 - 没有理由不能从过程中调用函数。 - Bob Jarvis - Слава Україні

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接