2016-10-20 134 views
0

我收到PL/SQL:ORA-00905:缺少关键字错误,当我运行下面的脚本如何在oracle中的where子句中使用case语句?

create or replace procedure testing 
(ass_line in char, 
curs out sys_refcursor 
) 
is 
begin 
open curs for 
select asl.Production_Group,asl.last_sequence_nbr 
from ASSEMBLY_LINE asl 
where(case 
    when ass_line='551F' 
    then asl.assembly_line in('551F','551C','551S') 
    else 
    asl.assembly_line=ass_line 
    end); 
end; 

请帮我

+3

除了语义上不正确'case'表达,它不允许选择'into'游标变量使用'开放 for'语句 –

+0

@Nicholas克拉斯诺夫。谢谢你的回复。我更新了我的帖子。我运行该过程中提到的过程,但在编译过程时,我正在丢失关键字。 – BabyboBNukes

+0

查看Tony的和/或David的回答。 –

回答

5

对于那些实际上在where子句中需要case语句的人。

where (case 
      when ass_line = '551F' then 
      case 
       when asl.assembly_line in ('551F', '551C', '551S') then 
       1 
       else 
       0 
      end 
      else 
      case 
      when asl.assembly_line = ass_line then 
       1 
      else 
      0 
      end 
     end) = 1 
+0

你在第二个else后缺少​​CASE/END关键字 – schurik

+0

感谢您指出我的错误。编辑示例。 – Rene

+0

@Rene。非常感谢答复。它的工作原理。你能告诉我关于“结束)= 1”的结尾吗? Wat在atlast分配1时发生? Wat数据1代表什么? – BabyboBNukes

3

不能使用case这样的,你必须使用or

select asl.Production_Group,asl.last_sequence_nbr 
from ASSEMBLY_LINE asl 
where( (ass_line='551F' and asl.assembly_line in('551F','551C','551S') 
    or (asl.assembly_line=ass_line) 
    ); 
+0

谢谢你的回复。但它显示了同样的错误。 – BabyboBNukes

+0

这是因为你不能选择一个游标变量(见尼古拉斯对你的问题的评论) –

+0

。那么我可以使用嵌套表吗? – BabyboBNukes

3

你应该使用:

where (ass_line = '551F' and asl.assembly_line in('551F','551C','551S')) or 
     (ass_line != '551F' and asl.assembly_line = ass_line)