ORACLE- CASE требует INTO?

Когда я попробую следующее:

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 ответа

Вы завернули свой SQL в блок начала / конца, что делает его оператором PL-SQL. В PL-SQL Oracle ожидает места для размещения набора результатов из SQL. Это источник вашей ошибки ORA-06550. Вы хотите, чтобы объявленная переменная PL-SQL содержала результат запроса через INTO.

Но утверждение SELECT все еще немного странно. На ваш взгляд, нет смысла иметь настоящую таблицу tableOfBeans в предложении FROM.

Вы хотели что-то подобное?

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. В этом случае вам все еще нужен способ сохранить набор результатов. Извините, если я не понимаю, что вы пытаетесь сделать. Немного подробнее поможет.

CASE заявление не требует INTO,
ORA-6550 - это общая ошибка, когда ваш SQL не компилируется. Ошибка сообщает, что она думает, что проблема в том, что нет 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;

Как ответили ранее, об ошибках говорит, что вы должны поместить результат выбора в переменную.

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: точная выборка возвращает более одной строки. Вместо этого используйте псевдо-таблицу dual или следуя коду 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;
Другие вопросы по тегам