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 を開始/終了ブロックでラップしたため、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.beanType = var_type. その場合でも、結果セットを保存する方法が必要です。あなたが何をしようとしているのか理解できていない場合は申し訳ありません。もう少し詳細が役立ちます。

于 2009-12-03T02:58:08.820 に答える
1

このCASEステートメントにはINTO.
ORA-6550 は、 SQL がコンパイルされない場合の一般的なエラーです。このエラーはINTO、次のように SELECT INTO ステートメントを実行しようとしていると考えているため、句がないことが問題であると考えていることを報告しています。

SELECT t.column
  INTO var_type
  FROM tableOfBeans

END CASEテストする Oracle インストールはありませんが、Oracle 9i/10g が 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コードに従って疑似表dualを使用してください。

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 に答える