ORACLE- CASE需要INTO吗?

时间:2009-12-03 02:32:05

标签: sql oracle case pls-00428

当我尝试以下操作时:

declare var_type VARCHAR2(10);

begin

  var_type := 'B';

  select case var_type 
           when 'B' then 'Beans' 
           when 'L' then 'Legumes' 
         end 
    from tableOfBeans ;

end;

我收到错误说

  

ORA-06550:第4行,第1栏:
  PLS-00428:SELECT语句中应该有一个INTO子句   在位置#:62

处检测到错误

但是当我不使用var_type但是使用'B'作为条件时,它可以很好地工作。任何人都可以告诉我为什么会发生这种情况,我该如何修复它以便我可以正确使用var_type

3 个答案:

答案 0 :(得分:5)

您已将SQL包装在开始/结束块中,这使其成为PL-SQL语句。在PL-SQL中,Oracle期望从SQL中放置结果集。这是您的ORA-06550错误的来源。您需要声明一个PL-SQL变量来通过INTO保存查询结果。

但SELECT语句仍然有点奇怪。你拥有它的方式,在FROM子句中有一个真正的表“tableOfBeans”是没有意义的。

你想要这样的东西吗?

declare var_type VARCHAR2(10);

begin

    select case tableOfBeans.beanType
               when 'B' then 'Beans'
               when 'L' then 'Legumes'
           end
      into var_type
      from tableOfBeans;

end;

实际上,如果tableOfBeans中有多行,那么也会产生错误。也许你想要的是从tableOfBeans中检索tableOfBeans.beanType = var_type的项目。在这种情况下,您仍然需要一种方法来存储结果集。对不起,如果我不明白你想做什么。更多细节将有所帮助。

答案 1 :(得分:1)

CASE声明不需要INTO ORA-6550 is a generic error用于SQL无法编译的时间。该错误报告它认为问题是没有INTO子句,因为它认为您正在尝试执行SELECT INTO语句,如下所示:

SELECT t.column
  INTO var_type
  FROM tableOfBeans

我没有要测试的Oracle安装,但我经历过Oracle 9i / 10g对CASE语句很奇怪,有时需要您使用END CASE而不仅仅是ENDEND CASEmentioned in the Oracle documentation here

通常你会在这种情况下使用DUAL,测试是否设置了变量:

var_type := 'B';

SELECT CASE var_type 
         WHEN 'B' then 'Beans' 
         WHEN 'L' then 'Legumes' 
       END CASE
  FROM DUAL;

答案 2 :(得分:0)

如前所述,错误表示您必须将选择的结果放入变量。

declare 
    var_type VARCHAR2(10);
    var_into VARCHAR2(10);
begin
    var_type := 'B';

    select case var_type 
           when 'B' then 'Beans'
           when 'L' then 'Legumes'
    end
    into var_into
    from tableOfBeans;
end;

如果您的table tableOfBeans包含多行,您将遇到另一个错误ORA-01422:exact fetch返回多行。使用伪表替代或替代pl / sql代码。

declare 
    var_type VARCHAR2(10);
    var_into VARCHAR2(10);
begin
    var_type := 'B';

    var_into := case var_type 
           when 'B' then 'Beans'
           when 'L' then 'Legumes'
    end;
end;