它在哪里说只有“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
答案 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