4

当我尝试以下操作时:

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正常使用?

4

3 回答 3

5

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

但是 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。在这种情况下,您仍然需要一种方法来存储结果集。抱歉,如果我不明白您要做什么。更多细节会有所帮助。

于 2009-12-03T02:58:08.820 回答
1

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

SELECT t.column
  INTO var_type
  FROM tableOfBeans

我没有要测试的 Oracle 安装,但我体验过 Oracle 9i/10g 的 CASE 语句很奇怪,有时需要您使用END CASE而不仅仅是END. END CASE在此处的 Oracle 文档中提到

通常你会使用 DUAL 来做这种事情,测试是否设置了变量:

var_type := 'B';

SELECT CASE var_type 
         WHEN 'B' then 'Beans' 
         WHEN 'L' then 'Legumes' 
       END CASE
  FROM DUAL;
于 2009-12-03T03:05:43.270 回答
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;

如果您的表 tableOfBeans 包含多行,您将遇到另一个错误 ORA-01422:精确提取返回多行。改用伪表对偶或遵循 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;
于 2009-12-03T08:39:00.560 回答