以更简洁的方式连接PL / SQL中的文本

时间:2014-11-06 10:52:09

标签: sql oracle plsql concatenation

我试图找到在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(good)或包含错误调用(bad)。

有没有更好的方法呢?这似乎相当冗长,我觉得,作为一个PL / SQL新手,我错过了一种以更有效,更短的方式做到这一点的明显方法。

3 个答案:

答案 0 :(得分:1)

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

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;

答案 1 :(得分: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;

答案 2 :(得分: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