2013-08-23 44 views
0

鉴于v_ssn_ind INTEGER := IF TRIM(p_ssn) IS NULL THEN 0 ELSE 1 END IF;Oracle PL/SQL可以将整数作为布尔值计算吗?

我知道我能做到这一点:IF v_ssn_ind=1 THEN…

但我可以做的短路计算,即:IF v_ssn_ind THEN…

+0

而且,对于加分,是任何更快或更慢? –

+2

除非'v_ssn_ind'被声明为布尔值,否则表达式'IF v_ssn_ind THEN'没有意义(如果我没有弄错,将不会编译)。 –

回答

6

首先,你所说的与short-circuit evaluation没有任何关系。当代码等

IF(quick_condition AND slow_condition) 
THEN 
    <<do something>> 
END IF; 

评估第二条件缓慢当且仅当初始快速条件评估为TRUE短路评价将是。

其次,您赋值为v_ssn_ind的语法不是有效的。

三,不,你不能说

IF <<integer variable>> 
THEN 

,因为那将没有任何意义。什么值会评估为TRUE,什么值会评估为FALSE?例如,如果0为FALSE且1为TRUE,那么17会转化为什么?

如果您声明某种指示变量,通常使用BOOLEAN数据类型而不是整数是有意义的。如果你使用布尔值,那么你可以做

IF <<boolean variable>> 
THEN 

因为这消除了歧义。然而,这不会比将= TRUE添加到IF条件更快。

+0

好吧,我会编辑标题文章和问题 - 比“短路评估”更合适吗? –

0

我不鼓励你把任何逻辑放到一个声明块中,我认为它使代码不太清晰。您可以使用CASE声明。

... 
    v_ssn_ind INTEGER; 
BEGIN 
    v_ssn_ind := CASE TRIM(p_ssn) IS NULL WHEN TRUE THEN 0 ELSE 1 END; 
... 

但我个人会选择BOOLEAN类型v_ssn_ind

... 
    v_ssn_ind BOOLEAN; 
BEGIN 
    v_ssn_ind := TRIM(p_ssn) IS NOT NULL; 
... 
+0

个人而言,我期望一个名为“_ind”的变量指向某种索引。也许将这个变量重命名为'v_ssn_is_not_null'会更有意义。 –

+0

你是对的,它会给变量的名称带来更多的含义。 – foobarbaz

+0

@JeffreyKemp:'_ind'是指标的简称;在我的第一份工作中,它是布尔变量的建议附录。 –

相关问题