2009-12-03 3 views
3

Когда я попробовать следующее: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: INTO пункта, как ожидается, в этом ВЫБРАТЬ заявление
обнаружена ошибка в позиции №: 62

но когда я не использую var_type, но вместо того, чтобы использовать «B», как кондицион это работает хорошо. Может кто-нибудь сказать мне, почему это происходит, и как я могу исправить это, чтобы правильно использовать var_type?

ответ

5

Вы завершили свой SQL в блоке begin/end, что делает его выражением 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

Заявление CASE не требует INTO.
ORA-6550 is a generic error, когда ваш SQL не компилируется. Ошибка сообщает, что он считает, что проблема не существует не INTO положения, потому что он думает, что вы пытаетесь выполнить заявление SELECT INTO, как это:

SELECT t.column 
    INTO var_type 
    FROM tableOfBeans 

Я не установить Оракул, чтобы проверить против, но я испытал, что Oracle 9i/10g странно с операциями CASE, иногда требуя, чтобы вы использовали END CASE, а не только END. END CASE является mentioned in the Oracle documentation here.

Обычно вы будете использовать DUAL для такого рода вещи, тестирование, если переменная установлена:

var_type := 'B'; 

SELECT CASE var_type 
     WHEN 'B' then 'Beans' 
     WHEN 'L' then 'Legumes' 
     END CASE 
    FROM DUAL; 
+0

CASE..END CASE PL/SQL, CASE..END - SQL. –

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