关于 return 语句的 Oracle 文档

Oracle documentation on return statement

哪里说 oracle 函数只是 "return" 语句 return 为 null。例如,这是一个简单的函数:

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

编辑

以上函数不会像 Alex Poole 报告的那样编译。因此,函数必须始终具有 return 值,例如数字、日期、blob、clob、varchar2 或 null。它不能只包含 "return"。 Return 因此在 oracle 中与 return null.

不同

我真正想知道的是它在哪里声明如果函数具有 returning 某些数据类型(数字、日期、varchar2、blob 或 clob)的签名并且它的主体包含 "return null" 声明,为什么允许,为什么它可以 return 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

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

ETA:哈哈,我应该先测试一下函数,根据 Alex 的评论,它无法编译。但我认为不将变量定义为 null 的一般原则仍然适用于其他地方 *{:-)

Where does it say that oracle function on just "return" statement returns null

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

函数中 return 的行为是 described in the PL/SQL subprogram documentation, and there is more detail about the return statement,这表示 expression:

Optional when the RETURN statement is in a pipelined table function. Required when the RETURN statement is in any other function. Not allowed when the RETURN statement is in a procedure or anonymous block.

The RETURN statement assigns the value of expression to the function identifier. Therefore, the data type of expression must be compatible with the data type in the RETURN clause of the function.

所以你修改后的问题实际上是在问最后一句话;为什么允许分配 null 而不管声明的 return 数据类型。但是您可以将 null 分配给大多数数据类型,正如 Boneist 指出的那样,大多数数据类型的变量都被初始化为 null。将数字变量设置为 null 是有效的。该文档页面前面的一行说:

the RETURN statement assigns a specified value to the function identifier

... 当您调用一个函数时,return 语句非常有效地将您的表达式计算的任何值分配给调用者的变量。 (显然,这是一个简单化的观点;可能有多个级别的调用者,您可能会从普通的 SQL 调用它,所以没有 PL/SQL 赋值,而且内部结构可能更复杂)。

只要变量是可以为null的类型,就没有违规。它并没有像您希望的那样明确地列出 - 更重要的是没有什么说您 can't return null。如果是这样的话,这将是在正常数据类型限制之上对函数 return 的限制。


有点跑题了,也有例外;如果您的数据类型是 restricted to not-null values, such as simple_integer,那么函数 returning 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

并且如果您对函数声明使用受限数据类型,则不能显式 return 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

您仍然可以 return 一个 计算 为 null 的表达式,编译器无法捕获(例如 RETURN 1 * NULL),但是您会当 运行 它仍然会出错:

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

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