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

时间:2009-04-21 10:18:42

标签: sql stored-procedures function plsql

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

7 个答案:

答案 0 :(得分:47)

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

示例:

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子句。这意味着它应该在函数体内的最后一个语句读取如下内容:

return(my_varchar2_local_variable);

其中my_varchar2_local_variable是应该由该函数返回的varchar2。

答案 1 :(得分:15)

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

select foo
      ,fn_bar (foo)
  from foobar

使用存储过程无法完成。查询优化器的体系结构限制了在此上下文中可以对函数执行的操作,要求它们是纯的(即,相同的输入始终产生相同的输出)。这限制了函数中可以执行的操作,但如果将其定义为“纯粹”,则允许在查询中将其用于内联。

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

答案 2 :(得分:1)

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

主要区别是:

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

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

  3. 实际上,我会针对特定需求组和针对可在多个方案之间共享的常见需求的函数寻求存储过程。例如:比较两个字符串,或修剪它们或取最后一部分,如果我们有一个函数,我们可以全局地将它用于我们拥有的任何应用程序。

答案 3 :(得分:-1)

以下是程序和功能之间的主要区别,

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

答案 4 :(得分:-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;
/

答案 5 :(得分:-1)

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

答案 6 :(得分:-2)

  1. 我们可以在存储过程中调用存储过程,在函数内调用函数,在函数内调用StoredProcedure但是我们不能在存储过程中调用函数。
  2. 我们可以在select语句中调用函数。
  3. 我们可以从函数返回值,而不将输出参数作为参数传递给存储过程。
  4. 这就是我发现的不同之处。如果有的话请告诉我。