不是的,它是而不是 PL/SQL中的函数返回后返回的最佳做法。
这是可能的,有时甚至建议添加代码只是闭嘴编译器,如:
exception
when fooex then
raise_application_error(-20100, 'invalid number');
return null; -- silence PLW-05005
end;
务必记录这样一个奇特的代码!
一般来说,我不喜欢一个代码,只是为了满足编译器警告,但总是有例外情况。在这个特定的情况下,我会说这个问题比编码更多的是编译器。在我看来,像下面的代码是完全有效的,编译器不应该抱怨它。事实上,我认为编译器应该警告,如果一个块在raise
之后有语句,因为它实际上是一个死码(unreachable code)。
让我们看看下面的函数:
$ cat foo.sql
create or replace function foo(p_in in number)
return number is
fooex exception;
begin
if p_in < 1 then
raise fooex;
end if;
return p_in;
exception
when fooex then
raise_application_error(-20100, 'invalid number');
end;
/
show errors
在Oracle 11g中XE运行此:
-- By default the warnings are disabled
SQL> @foo
Function created.
No errors.
通常我想所有的警告:
SQL> alter session set plsql_warnings = 'ENABLE:ALL';
Session altered.
SQL> @foo
SP2-0806: Function created with compilation warnings
Errors for FUNCTION FOO:
LINE/COL ERROR
-------- -----------------------------------------------------------------
1/1 PLW-05005: subprogram FOO returns without value at line 13
1/1 PLW-05018: unit FOO omitted optional AUTHID clause; default
value DEFINER used
审查我找到的代码之后出上面的警告是不正确的,所以我只对这个编译单元禁用它们:
SQL> alter session set plsql_warnings = 'ENABLE:ALL, DISABLE:(5005,5018)';
Session altered.
SQL> @foo
Function created.
No errors.
SQL>
现在一切都很好,很棒。
我的建议是默认打开所有警告,然后关闭每个编译单元的错误肯定(alter session set plsql_warnings = 'ENABLE:ALL, DISABLE:(5005,5018)';
)。如果可能的话:alter system plsql_warnings = 'ENABLE:ALL';
但实际上这可能有点太苛刻了......
而且,建议您打开所有编译器错误检查。我们作为程序员需要编译器可以给我们的所有帮助!不幸的是,对于Oracle PL/SQL编译器来说,这需要被破坏。
此外,如果你确实把回报放在那里,验证器应该说'线路不可达'。 –
在这种情况下,验证器是Oracle的PL/SQL编译器。 – user272735
是的......它搞砸了。它是人工分析与人工AI分析的区别。 –