【发布时间】:2015-02-13 14:39:59
【问题描述】:
它在哪里说“return”语句上的 oracle 函数返回 null。例如,这里是一个简单的函数:
create or replace FUNCTION FOO RETURN NUMBER AS
BEGIN
RETURN;
-- is return null the same as return?
END FOO;
编辑
上述函数不会像 Alex Poole 报告的那样编译。因此,函数必须始终具有返回值,例如数字、日期、blob、clob、varchar2 或 null。它不能只包含“return”。因此,return 在 oracle 中与 return null 不同。
我真正想知道的是它在哪里声明如果函数具有返回某些数据类型(数字、日期、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
【问题讨论】:
-
第二个问题:oracle 中的
null和PHP 中的null不太一样。在 oracle 中,与null的每个比较都是false,所以( null > 0)和(null == 0)和(null < 0)或与(null > '0')相同的都是false。在 PHP 中的 afaik 取决于上下文,与数字零相比,null可能评估为零并且条件可以变为true。 -
再次考虑 PHP 应该是这样的:
( null == 0)计算结果为(false == false)计算结果为(true)。另一方面,( null === 0)应该评估为false,因为数据类型也必须匹配。暂时无法测试。无论如何,我更喜欢 Oracles 空逻辑 ;) -
在 Oracle 中不是这样 -
(null > 0)、(null = 0)和(null < 0)都评估为未知(因此是null),而不是false。 Oracle 中的布尔逻辑实际上是三值逻辑——true、false和null——你必须记住要么迎合或消除 null 情况的可能性。 -
你显示的内容无法编译;你会得到
PLS-00503: RETURN <value> statement required for this return from function。你只能有一个简单的RETURN没有表达式in a pipelined function 或一个过程。文档没有说明“return 与 return null 相同”,因为它不是...... -
@AlexPoole 你当然是对的。嗯..应该先测试函数是否编译。