在 for 循环中使用 case 语句选择变量
Posted
技术标签:
【中文标题】在 for 循环中使用 case 语句选择变量【英文标题】:Select into a variable with case statement in a for loop 【发布时间】:2017-11-09 08:16:45 【问题描述】:foo 变量应该在 for 循环中用 select case 填充,然后输出。我在异常中使用了 goto end_loop 引用,因此循环可以继续。 在我提出异常之前,我遇到了 ORA-01403 错误。现在我有一个 ORA-01422 错误。没有 case 语句的其他选择工作正常。
declare
foo varchar2(2000);
BEGIN
FOR rec IN (SELECT something FROM somewhere)
LOOP
BEGIN
Select case when attribute = 'something' then '1' end into foo from somewhere where some_condition;
DBMS_OUTPUT.put_line( 'Something' || foo);
EXCEPTION
WHEN NO_DATA_FOUND THEN
foo := NULL;
goto end_loop;
END;
<<end_loop>>
null;
END LOOP;
END;
编辑
更详细
declare
opdatum varchar2(2000);
opdiagnose varchar2(2000);
d_op varchar2(2000);
some_variable varchar2(2000);
BEGIN
FOR rec IN (SELECT p.name, p.vorname, p.geburtsdatum, a.kis_id, kg.kg_id FROM kg_eintraege kg
INNER JOIN aufenthalte a
ON kg.patient_nr = a.patient_nr
and kg.fall_nr = a.fall_nr
INNER JOIN personen p
ON a.patient_nr = p.pat_nr
WHERE kg.kgtitel_nr = xxxxxxa
and a.kis_id = xxxxxxb)
LOOP
BEGIN
Select kurztext into opdatum from kg_eintraege where kontext = rec.kg_id and kgtitel_nr = xxxxxxc;
Select text into opdiagnose from kg_eintraege where kontext = rec.kg_id and kgtitel_nr = xxxxxxd;
Select text into d_op from kg_eintraege where kontext = rec.kg_id and kgtitel_nr = xxxxxxe;
Select case when kurztext = 'Something' then '1' end into some_variable from kg_eintraege where kontext = rec.kg_id and kgtitel_nr = xxxxxxf;
DBMS_OUTPUT.put_line(rec.name || ' ' || rec.vorname || ' ' || TO_CHAR(rec.geburtsdatum, 'DD.MM.YYYY')
|| ' ' || rec.kis_id || ' ' || opdatum|| ' ' || opdiagnose ||
' ' || d_op || ' ' || some_variable
);
EXCEPTION
WHEN NO_DATA_FOUND THEN
some_variable := NULL;
goto end_loop;
END;
<<end_loop>>
null;
END LOOP;
END;
更新
case 语句似乎没问题。问题是选择中的某些行为空。
更新2
不需要例外。
解决方案:
select nvl((select case when kurztext = 'Something' then '1' end from kg_eintraege where kontext = rec.kg_id and kgtitel_nr = xxxxxxf and kurztext = 'Something'), 'NOT_FOUND') into some_variable from dual
感谢 NikNik 的帮助。
【问题讨论】:
FOR rec IN (SELECT case when attribute = 'something' then '1' end AS FOO FROM somewhere where some_condition) LOOP
呢?
您的循环标签 > 在循环内。它目前跳转到无论如何都会结束的地方。你能在表格中显示为数据吗
@Wernfried,我做不到。
@Bennet 很遗憾,出于数据保护的原因,我不能这样做。
@SushiBlyat,你的 cmets 很奇怪。为什么不能重写 SELECT 语句?你应该能够提供一些更真实的假数据,然后你会得到适当的帮助。
【参考方案1】:
您的问题不是CASE
,而是您的WHERE
条件女巫正在返回超过 1 条记录或找到 0 条记录。
更多详情请看here。
第二种情况你可以this:
select nvl( (your_case), 'NOT_FOUND' ) into foo from dual;
【讨论】:
怎么样?它在循环之外工作。并且循环内的其他选择具有相同的 where 条件和不同的值。 where条件中的不同值可以改变结果。尝试在工作选择中放置一个案例(可能是 for 循环中的第一个 1) ORA-01403 错误再次出现,当我在第一个工作选择中放置一个案例时。你有什么建议? 您可能没有任何记录。看看我的更新select nvl((select case when kurztext = 'Something' then '1' end from kg_eintraege where kontext = rec.kg_id and kgtitel_nr = xxxxxxf), 'NOT_FOUND') into some_variable from dual ;
你的意思是这样吗?以上是关于在 for 循环中使用 case 语句选择变量的主要内容,如果未能解决你的问题,请参考以下文章