在 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 语句选择变量的主要内容,如果未能解决你的问题,请参考以下文章

6多分支if结构和case循环语句

选择,循环语句结构总结

shell脚本的学习和使用

shell脚本的学习和使用

shell脚本的学习和使用

浅谈Shell脚本中for循环while循环及case分支语句