有关return语句的Oracle文档

时间:2015-02-13 14:39:59

标签: oracle function plsql

它在哪里说只有“return”语句的oracle函数返回null。例如,这是一个简单的函数:

create or replace FUNCTION FOO RETURN NUMBER AS 
BEGIN
  RETURN;
  -- is return null the same as return?
END FOO;

修改

以上功能不会像 Alex Poole 报道的那样编译。因此,函数必须始终具有返回值,例number,date,blob,clob,varchar2或null。它不能只包含“返回”。因此,返回oracle与return null不同。

我真正想知道的是,如果函数具有返回某些数据类型(number,date,varchar2,blob或clob)的签名并且其正文包含“return null”语句,那么为什么允许这样做,为什么它可以返回null。我想这与脚本语言中的相同,例如PHP:

function foo($i)
{
  if( $i > 0 )
    return $i;
  return null; // return is the same as return null. Tested in PHP.
}

当然,在C#中不允许这种行为:

static int foo() {return null;}
Error 1 Cannot convert null to 'int' because it is a non-nullable value type

2 个答案:

答案 0 :(得分:1)

我不认为你会在文档中明确地为函数找到这样的声明。但是,如果您在this bit of the documentation about declarations中看到By default, variables are initialized to NULL...。因此,如果您没有初始化返回值,它将自动为NULL。

ETA:哈哈,我应该先测试一下这个功能,根据Alex的评论,它不会编译。但我认为不将变量定义为null的一般原则仍然在其他地方* {: - )

答案 1 :(得分:1)

  

在哪里说oracle函数只是"返回"语句返回null

它无论如何都不能说,因为它不是真的。如果it is pipelined,你只能在一个函数中有一个简单的return而不是return <expression>,即管道机制已经返回了数据,而返回只是为了表示控制(而不是比数据)应该返回给调用者。您还可以在过程中使用普通return。您的示例函数无法编译 - 您将获得PLS-00503: RETURN <value> statement required for this return from function,因为没有表达式。

来自某个函数的return的行为是described in the PL/SQL subprogram documentation,还有关于the return statement的详细信息,其中包含expression

  

当RETURN语句位于流水线表函数中时可选。 RETURN语句在任何其他函数中时是必需的。当RETURN语句在过程或匿名块中时不允许。

     

RETURN语句将表达式的值分配给函数标识符。因此,表达式的数据类型必须与函数的RETURN子句中的数据类型兼容。

所以你修改过的问题实际上是在询问最后一句话;无论声明的返回数据类型如何,您都可以分配null。但是你可以为大多数数据类型分配null,而且正如Boneist所指出的,大多数数据类型的变量都被初始化为null。将数字变量设置为null是有效的。该文档页面前面的一行说明:

  

RETURN语句为函数标识符

指定一个指定的值

...当你调用一个函数时,return语句会为你的表达式赋予调用者变量的任何值。 (显然,这是一个简单的视图;可能有几个级别的调用者,你可能会从普通的SQL调用它,因此没有PL / SQL赋值,并且内部可能更复杂)。 / p>

只要变量是一个可以为null的类型,就没有违规。它并没有像你希望的那样明确地表达出来 - 更不用说你无法返回null。如果是这种情况,则会对正常数据类型限制之上的函数返回进行限制。


偏离主题,有例外;如果您的数据类型为restricted to not-null values,例如simple_integer,则返回null的函数有效:

create or replace FUNCTION FOO RETURN NUMBER AS 
BEGIN
  RETURN NULL;
END FOO;
/

FUNCTION FOO compiled

...但是调用它并尝试将值分配给约束变量将失败:

declare
  n simple_integer := 0;
begin
  n := foo;
end;
/

ORA-06502: PL/SQL: numeric or value error
ORA-06512: at line 4

如果为函数声明使用约束数据类型,则无法显式返回null:

create or replace FUNCTION FOO RETURN SIMPLE_INTEGER AS 
BEGIN
  RETURN NULL;
END FOO;
/

FUNCTION FOO compiled
Errors: check compiler log

和show_errors显示:

3/10           PLS-00382: expression is of wrong type
3/3            PL/SQL: Statement ignored

您仍然可以将评估的表达式返回null,编译器无法捕获(例如RETURN 1 * NULL),但是当您仍然会收到错误时运行它:

declare
  n number;
begin
  n := foo;
end;
/

ORA-06502: PL/SQL: numeric or value error
ORA-06512: at "STACKOVERFLOW.FOO", line 3
ORA-06512: at line 4