Pet*_*ros 49

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

例:

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
Run Code Online (Sandbox Code Playgroud)

注意函数如何在参数列表和"as"关键字之间有一个return子句.这意味着它应该在函数体内的最后一个语句读取如下内容:

return(my_varchar2_local_variable);
Run Code Online (Sandbox Code Playgroud)

其中my_varchar2_local_variable是应该由该函数返回的一些varchar2.

  • 稍微澄清一下,您仍然可以从过程中获取OUT值 - 实际上,您可以为指定的每个OUT参数设置返回值. (15认同)

Con*_*lls 16

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

select foo
      ,fn_bar (foo)
  from foobar
Run Code Online (Sandbox Code Playgroud)

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

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