除了在 PL/SQL 中使用 elsif 与嵌套 if 的可读性之外,还有其他原因吗?

Posted

技术标签:

【中文标题】除了在 PL/SQL 中使用 elsif 与嵌套 if 的可读性之外,还有其他原因吗?【英文标题】:Is there any other reason besides readability to use elsif versus nested if in PL/SQL? 【发布时间】:2014-02-22 02:04:02 【问题描述】:

所以我在学习 Transact-SQL,它没有等效的 elsif,只有一个伪结构,else if,它实际上是一个嵌套的 if...else。我做 PL/SQL 程序员大约有 8 年了,所以我一直在使用 if...elsif...else 有一段时间没有真正考虑过。我知道 elsif 将执行保持在单个逻辑块中而不是一系列嵌套块中,但是除了使用 elsif 与嵌套 if 的可读性之外,还有其他原因吗?本质上,将它们保持在单个逻辑块中是否有效率提升或其他好处?

例如我可以这样做:

if x = 1 then
    dbms_output.put_line('foo');
elsif x=3 then
    dbms_output.put_line('foo2');
else
    dbms_output.put_line('foo3');
end if;

或者我可以这样做:

if x=1 then
    dbms_output.put_line('foo1');
else 
     if x=3 then
         dbms_output.put_line('foo2');
     else
         dbms_output.put_line('foo3');
     end if;
end if;

我知道 PL/SQL 最佳实践建议使用第一个示例,但我很好奇除了无关的“end if;”之外是否还有其他原因。以及当您超过 2 或 3 级深度时的凌乱缩进。有什么想法吗?

【问题讨论】:

我想你已经回答了你自己的问题。 您可以查看您的代码。您发现哪个代码不那么简陋和可读性。 ;) 忽略可读性,目的本身是不同的。在您的情况下,它们似乎是多余的,但实际上并非如此。它不仅适用于 PL/SQL.. IF-ELSIF 非常类似于 SWITCH.. 一次只会执行一个。 Where-as 嵌套 IF 让您可以灵活地进行多个条件检查。所以选择什么有利于你!这就像选择 For/While 循环! 【参考方案1】:

我更仔细地阅读了 Oracle 的风格指南,并注意到 Oracle 确实说过它们在执行方式和预期性能方面是相同的。因此,除了在逻辑上将条件与 If...elsif...else 与离散条件语句联系在一起之外,Oracle 执行语句没有任何好处。感谢您对此的所有回复。

【讨论】:

以上是关于除了在 PL/SQL 中使用 elsif 与嵌套 if 的可读性之外,还有其他原因吗?的主要内容,如果未能解决你的问题,请参考以下文章

在 pl/sql 中使用嵌套循环但未显示正确的输出

使用嵌套表在 Oracle PL/SQL 中构建动态 SQL

在 oracle pl/sql 中如何选择嵌套类型?

pl/sql 流程控制语句

pl/sql 中的嵌套 PIPELINED 函数

PL/SQL集合(table)嵌套表操作实例讲解实例