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

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

238835 次浏览

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

例如:

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。

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

select foo
,fn_bar (foo)
from foobar

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

否则,函数(不一定是确定的)可以返回变量或结果集。对于返回结果集的函数,您可以将其与查询中的其他选择进行联接。但是,您不能在相关子查询中使用这样的非确定性函数,因为优化器无法预测将返回什么类型的结果集(这在计算上是难以处理的,比如停止问题)。

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

这就是我发现的不同之处,如果有的话请告诉我。

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

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

用一种非常简单的方式来表达这个意思。

功能:

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

程序:

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

示例程序:

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

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

主要区别是:

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

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

实际上,我会为一组特定的需求建立一个存储过程,为一个可以跨多个场景共享的公共需求建立一个函数。例如: 比较两个字符串,或者修整它们,或者取最后一部分,如果我们有一个用于这个的函数,我们可以在全局范围内使用它,用于我们拥有的任何应用程序。

简而言之——函数返回一些东西。你可以在 SQL 查询中使用函数。 过程是用于处理数据的代码的一部分,但是不能从查询中调用过程,必须在 PL/SQL 块中运行它。