【问题标题】:Select into a variable with case statement in a for loop在 for 循环中使用 case 语句选择变量
【发布时间】: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 语句?你应该能够提供一些更真实的假数据,然后你会得到适当的帮助。

标签: sql oracle plsql


【解决方案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 ; 你的意思是这样吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-06-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-15
相关资源
最近更新 更多