使用NULL时PLW-06002无法访问的代码;

时间:2009-08-28 13:04:41

标签: oracle plsql

我偶尔会做类似......

IF very-likely-condition THEN
    NULL;
ELSE
    <<code to deal with the unlikely condition>>
END IF;

在NULL行上的PL / SQL编译器发出 PLW-06002无法访问代码警告,提示IF。

现在虽然我可以清楚地忽略警告和/或重构IF语句为NOT,但我认为这样做更好。

所有人都知道是否有另一种插入空语句的方法,这样我就不会收到编译器警告?

修改

我不是说我经常这样做......实际上我很少这样做。但偶尔我认为这样做会更好。

编辑2:

此外还有其他可能有效的情况(例如忽略EXCEPTION块中的特定错误)。我只用IF作为一个简单的例子来说明这一点。

3 个答案:

答案 0 :(得分:4)

递归和博客:

以下陈述 NOT 等效:

IF :x = 0 THEN
   NULL;
ELSE
   do_something;
END IF;

IF NOT :x = 0 THEN
   do_something;
END IF;

如果:x为空,do_something程序将仅在第一种情况下称为 。这是因为表达式NULL = 0在Oracle中既不是TRUE也不是FALSE,它是“未知的”。

重写第一个语句的正确方法是:

IF :x != 0 OR :x IS NULL THEN
   do_something;
END IF;

我可以看到为什么在某些情况下我们可以把事情写成OP。

答案 1 :(得分:3)

看起来这是设计的。见http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14261/controlstructures.htm#i5421

示例4-23创建子程序时使用NULL作为占位符

CREATE PROCEDURE ... AS
BEGIN  
  NULL; -- use NULL as placeholder, raises "unreachable code" if warnings enabled
END;
/

答案 2 :(得分:0)

为什么你的声明空洞?那是代码味道。人们普遍认为,使用空if块, 更容易阅读。

if条件更改为与当前条件相反的条件:

IF NOT very-likely-condition THEN
    <<code to deal with the unlikely condition>>
END IF;

如果在条件为真时需要执行某些操作,则可以始终将该块重新添加。空块将条件与条件为真时执行的块分开。它看起来像你以前在if部分中有代码,然后将其删除但却懒得重写if条件以删除空语句。

主观上,如果我正在阅读你的代码并看到空if块,我认为你不知道你在做什么。