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

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

3 голосов
/ 03 декабря 2009

Когда я пытаюсь сделать следующее:

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 ]

5 голосов
/ 03 декабря 2009

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

1 голос
/ 03 декабря 2009

Оператор 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;
0 голосов
/ 03 декабря 2009

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

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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...