PL/SQL 中函数和过程的区别是什么?
过程没有返回值,而函数有。
例如:
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
不能用存储过程完成。查询优化器的体系结构限制了在此上下文中可以对函数执行的操作,要求它们是纯的(即相同的输入总是产生相同的输出)。这限制了函数中可以执行的操作,但是如果查询被定义为“纯”,则允许在查询中内联使用它。
否则,函数(不一定是确定的)可以返回变量或结果集。对于返回结果集的函数,您可以将其与查询中的其他选择进行联接。但是,您不能在相关子查询中使用这样的非确定性函数,因为优化器无法预测将返回什么类型的结果集(这在计算上是难以处理的,比如停止问题)。
这就是我发现的不同之处,如果有的话请告诉我。
以下是过程和函数的主要区别,
用一种非常简单的方式来表达这个意思。
功能:
这些子程序返回 单一价值; 主要用于计算和返回值。
程序:
这些子程序 不返回值直接; 主要用于执行一个动作。
示例程序:
CREATE OR REPLACE PROCEDURE greetings BEGIN dbms_output.put_line('Hello World!'); END ; /
执行独立程序:
一个独立的过程可以通过两种方式调用:
‧使用 EXECUTE关键字 •从 PL/SQL 块调用过程的名称
EXECUTE
该过程也可以从另一个 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
totalCustomers
DECLARE c number(3); BEGIN c := totalEmployees(); dbms_output.put_line('Total no. of Employees: ' || c); END; /
存储过程和函数都是驻留在数据库中的命名块,可以在需要时执行。
主要区别是:
存储过程可以选择使用 out 参数返回值,但也可以以不返回值的方式编写。但是,函数必须返回一个值。
存储过程不能在 SELECT 语句中使用,而函数可以在 SELECT 语句中使用。
实际上,我会为一组特定的需求建立一个存储过程,为一个可以跨多个场景共享的公共需求建立一个函数。例如: 比较两个字符串,或者修整它们,或者取最后一部分,如果我们有一个用于这个的函数,我们可以在全局范围内使用它,用于我们拥有的任何应用程序。
简而言之——函数返回一些东西。你可以在 SQL 查询中使用函数。 过程是用于处理数据的代码的一部分,但是不能从查询中调用过程,必须在 PL/SQL 块中运行它。