PL/SQL中函数和过程的区别是什么?
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(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 块中调用过程名称
该过程还可以从另一个 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;
/
存储过程和函数都是命名块,驻留在数据库中,可以随时执行。
主要区别如下:
存储过程可以选择使用输出参数返回值,但也可以以不返回值的方式编写。但是,函数必须返回一个值。
存储过程不能用于SELECT语句,而函数可以用于SELECT语句。
实际上,对于特定的一组需求,我会选择存储过程,对于可在多个场景中共享的常见需求,我会选择函数。例如:比较两个字符串、修剪它们或取最后一部分,如果我们有一个函数,我们可以全局地将其用于任何应用程序。
下面是过程和函数之间的主要区别:
这就是我发现的区别,请告诉我是否有任何问题。