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

Oracle PLW-06002使用NULL时无法访问的代码;,oracle,plsql,Oracle,Plsql,我偶尔做一些像 IF very-likely-condition THEN NULL; ELSE <<code to deal with the unlikely condition>> END IF; 它在IF后面的空行上给出了PL/SQL编译器发出的PLW-06002不可访问代码警告 现在,虽然我可以清楚地忽略警告和/或将IF语句重构为NOT,但我认为这样读起来更好 有人知道有没有另一种方法可以插入空语句,这样我就不会得到编译器警告了 编辑: 我不是

我偶尔做一些像

IF very-likely-condition THEN
    NULL;
ELSE
    <<code to deal with the unlikely condition>>
END IF;
它在IF后面的空行上给出了PL/SQL编译器发出的PLW-06002不可访问代码警告

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

有人知道有没有另一种方法可以插入空语句,这样我就不会得到编译器警告了

编辑:

我不是说我经常这么做。。。事实上,我很少这样做。但有时我确实认为这样读起来更好

编辑2:


另外,在其他情况下,这样做可能是有效的,例如忽略异常块中的特定错误。我只是用IF作为一个简单的例子来说明这一点。

为什么有一个空语句?那是一种代码气味。人们普遍认为,用空的if块阅读并不容易

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

IF NOT very-likely-condition THEN
    <<code to deal with the unlikely condition>>
END IF;
如果在条件为真时需要执行某些操作,则始终可以将该块添加回。空块将条件与条件为真时执行的块分开。看起来您以前在if部分中有代码,然后删除了它,但是太懒了,没有重写if条件来删除空语句


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

对于递归和Weblog:

以下陈述并不等同:

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

如果:x为NULL,则只在第一种情况下调用do_something过程。这是因为表达式NULL=0在Oracle中既不是TRUE也不是FALSE,它是未知的

重新编写第一条语句的正确方法是:

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

我能理解为什么在某些情况下我们可以把事情写成OP。

看起来这是设计的。看

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

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

我在问题中已经说过,我知道我能做一件不可能的事。我并不是说这是我经常做的事。。。。但在某些罕见的情况下,我确实认为这更具可读性。您对这个问题有答案吗?您使用的是哪种pl/sql优化器级别?从v$parameter中选择name,value,其中name='plsql\u optimize\u level'检查Oracle可能正在将代码重构为适用于级别2的{NOT…}格式。在IF的情况下很可能是这样,但我仍然想知道是否有其他情况的解决方法,例如忽略异常块中的某些错误这有点异味,但是您可以创建一个带有NULL的NOP过程,并在父代码中使用它而不是NULL-这样,您只会在创建NOP时看到警告-这会给您的PL/SQL某种汇编语言的感觉:@dpbradley:NOP过程只执行NULL也会引发警告PLW-06002,对于这个有趣的问题,它开始感觉像是递归=+1。我在开发时经常遇到这种情况,我只需要添加一个存根或占位符。我很想知道答案是什么
CREATE PROCEDURE ... AS
BEGIN  
  NULL; -- use NULL as placeholder, raises "unreachable code" if warnings enabled
END;
/