2009-04-21 73 views
62

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

+13

我不同意这是重复的。一般来说,编程语言(如过程和函数)在数据库系统中的使用方式不同。这是一个很好的问题,答案只是“与编程语言相同的区别:请参阅<其他问题>”。 – 2009-04-21 10:35:03

+1

没有人有自从oracle 11g和转发以来的差异列表?我认为我们现在可以在函数中使用某些额外的功能! – MozenRath 2013-12-26 06:40:14

回答

45

过程没有返回值,而函数有。

实施例:

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 

通知函数如何具有参数列表和“如”关键字之间的return子句。这意味着,它预计将有最后陈述里面的函数体读的东西,如:

return(my_varchar2_local_variable); 

哪里my_varchar2_local_variable一些VARCHAR2应该由该函数返回。

+14

作为一点澄清,您仍然可以从过程获取OUT值 - 实际上,您可以为每个指定的OUT参数设置一个返回值。 – GoingTharn 2009-06-03 21:27:34

15

函数可以被插入到SQL语句中,例如,

select foo 
     ,fn_bar (foo) 
    from foobar 

这不能用存储过程完成。查询优化器的架构限制了在这种情况下可以对函数做什么,要求它们是纯的(即相同的输入始终产生相同的输出)。这限制了在函数中可以做什么,但是如果它被定义为“纯”,则允许它在查询中被内联使用。

否则,函数(不一定是确定性的)可以返回一个变量或结果集。在函数返回结果集的情况下,您可以将其与查询中的其他选择进行加入。但是,在相关的子查询中不能使用像这样的非确定性函数,因为优化器无法预测将返回哪种结果集(这在计算上难以处理,就像停止问题一样)。

+0

它可能没有意义,但优化器不会阻止您在任何地方使用非确定性函数。 – 2013-06-29 04:52:41

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

这就是我发现的区别。请让我知道,如果有的话。

+1

你是不正确的 - 没有理由不能从过程调用函数。 – 2016-06-16 19:44:07

-1

以下是过程和函数之间的主要区别,

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

在死亡简单的方式,它使这个含义。

功能:

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

步骤:

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

范例程序:

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; 
/
0

这两个存储过程和函数都被命名为bloack,它们驻留在Da中并且可以在需要时执行。

的主要区别是:

1.A存储过程可以使用出参数可选地返回的值,但也可以在没有。但是函数返回一个值必须返回值

写入的方式2.存储过程不能用在select语句中,因为函数可以在select语句中使用。

实际上我会为一组特定的需求和一个可以在多个场景中共享g的常见需求的函数:两个字符串之间的比较,或修剪它们或采取最后一部分,如果我们有这个功能,我们可以在全球范围内将它用于我们拥有的任何应用程序

-1

用几句话 - 函数返回一些东西。您可以在SQL查询中使用函数。 过程是使用数据执行某些操作的代码的一部分,但无法从查询调用过程,您必须在PL/SQL块中运行它。