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;