我试图找到在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新手,我错过了一种以更有效,更短的方式做到这一点的明显方法。
答案 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