2014-11-06 45 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 
相關問題