2014-11-06 43 views
1

我试图找到最有效的方式来连接PL/SQL中的文本。我的系统扫描五个变量,并执行这些方针的东西:以更简洁的方式连接PL/SQL中的文本

return_value := '' 
    IF variable_a is null THEN 
     return_value := 'Error: Variable A null'; 
    END IF; 

    IF variable_b is null THEN 
     IF return_value = '' THEN 
      return_value := 'Error: Variable B null'; 
     ELSE 
      return_value := return_value || ', Variable B null'; 
    END IF; 

    IF variable_c is null THEN 
     IF return_value = '' THEN 
      return_value := 'Error: Variable C null'; 
     ELSE 
      return_value := return_value || ', Variable c null'; 
    END IF; 

    etc. 

希望的什么,我试图做的逻辑是明确的 - 确定是否有任何的五个变量为null并连接每一个错误的文本消息传递给返回值,所以在一堆if/else语句结束时,返回值为null(好)或包含错误调用(bad)。

有没有更好的方法来做到这一点,虽然?它看起来很长,我觉得,作为一名PL/SQL新手,我错过了一种以更高效,更短的方式做到这一点的明显方式。

+0

在某些情况下,PL/SQL是一个冗长的语言。通常它不值得减少冗长,因为在许多情况下代码的清晰度会降低太多。初学者尤其如此。从下面的3个答案中,我更喜欢Bacs为初学者提供的简单答案,尽管FrancescoGenta的帮助功能解决方案也很棒。德米特里的答案也很聪明,但并不完全是我的代码库中解决这样一个简单问题的解决方案(一周后,需要很多开发人员的大脑周期来解码发生的事情)。 – user272735 2014-11-10 06:53:29

回答

1

有很多方法可以做到这一点我相信。一种可能性是以相同的方式连接所有错误,如'变量? null“,然后如果必要,添加前缀'Error:'并在末尾删除多余的逗号和空格。

return_value := ''; 

IF variable_a is null THEN 
    return_value := 'Variable A null, '; 
END IF; 

IF variable_b is null THEN 
    return_value := return_value||'Variable B null, '; 
END IF; 

IF variable_c is null THEN 
    return_value := return_value||'Variable C null, '; 
END IF; 

IF variable_d is null THEN 
    return_value := return_value||'Variable D null, '; 
END IF; 

IF variable_e is null THEN 
    return_value := return_value||'Variable E null, '; 
END IF; 

IF return_value <> '' THEN 
    return_value := 'Error: '||return_value;   
    return_value := RTRIM(return_value, ', '); 
END IF; 
0

你可以定义一个模拟三元运算符的函数,这使得我的意见中的代码更加可读。 错误的最终表现显然可以改善。

declare 

    return_value varchar2(4001); 

    variable_a varchar2(1) := null; 
    variable_b varchar2(1) := 'B'; 
    variable_c varchar2(1) := 'C'; 

    function iif(predicate boolean, if_true varchar2, if_false varchar2 := '') return varchar2 as 
    begin 
    if(predicate) then 
     return if_true; 
    else 
     return if_false; 
    end if; 
    end; 

begin 

    return_value := iif(variable_a is null, ', Variable A null') 
    || iif(variable_b is null, ', Variable B null') 
    || iif(variable_c is null, ', Variable C null'); 

    return_value := iif(return_value is not null, 'Error: ' || substr(return_value, 2, length(return_value))); 

    dbms_output.put_line('[' || return_value || ']'); 

end; 
0

我的决定是很奇怪的,但我喜欢它:

declare 
    a varchar2(10) := ''; 
    b varchar2(10) := 'brt'; 
    c varchar2(10) := ''; 
    d varchar2(10) := 'sdf'; 
    e varchar2(10) := ''; 
    return_value varchar2(1000); 
begin 
    select listagg(dcd, ',') within group (order by dcd) 
    into return_value 
    from (select decode(col, null, 'variable ' || n || ' is null', null) dcd 
      from (select a col, 'a' n from dual union all 
        select b, 'b' from dual union all 
        select c, 'c' from dual union all 
        select d, 'd' from dual union all 
        select e, 'e' from dual)); 

    dbms_output.put_line('return_value: ' || return_value); 
end; 
/

回报:

return_value: variable a is null,variable c is null,variable e is null 
相关问题