#oracle #plsql #case
#Oracle #plsql #case
Вопрос:
Я получаю PL / SQL: ORA-00905: ошибка с отсутствующим ключевым словом при запуске следующего скрипта
create or replace procedure testing
(ass_line in char,
curs out sys_refcursor
)
is
begin
open curs for
select asl.Production_Group,asl.last_sequence_nbr
from ASSEMBLY_LINE asl
where(case
when ass_line='551F'
then asl.assembly_line in('551F','551C','551S')
else
asl.assembly_line=ass_line
end);
end;
Пожалуйста, помогите мне
Комментарии:
1. Помимо семантически неправильного
case
выражения, не разрешается выбиратьinto
инструкцию использованияopen <cursor_variable> for
переменной курсора2. @Николай Краснов. Спасибо за ответ. Я обновил свой пост. Я запускаю процедуру, как указано в сообщении, но при компиляции процедуры я получаю недостающее ключевое слово.
3. Смотрите ответ Тони и / или Дэвида.
4. к вашему сведению, вам действительно следует использовать
varchar2
for strings (илиtable.column%type
), а неchar
, который имеет ряд особенностей, которые, скорее всего, вызовут странные ошибки, чем будут полезны.
Ответ №1:
Для тех, кто попадает сюда, кому действительно нужен оператор case в предложении where.
where (case
when ass_line = '551F' then
case
when asl.assembly_line in ('551F', '551C', '551S') then
1
else
0
end
else
case
when asl.assembly_line = ass_line then
1
else
0
end
end) = 1
Комментарии:
1. вы пропускаете ключевые слова CASE / END после второго else
2. @Rene. Большое спасибо за ответ. Это работает. Не могли бы вы, пожалуйста, рассказать мне о «end) = 1» в конце? Что происходит, когда 1 присваивается в atlast? Что представляет dat 1?
3. Это не присваивание, а оператор отношения. Результатом оператора case является либо 1, либо 0. Вы выбираете только те записи, в которых оператор case приводит к 1. Спасибо, что приняли это как ответ, но решение Тони Эндрюса намного проще и, на мой взгляд, лучший ответ.
4. Я дал этот ответ только для того, чтобы показать, как использовать оператор case в предложении where. Некоторые люди могут искать это, и заголовок вашего вопроса, возможно, привлек их на эту страницу.
Ответ №2:
Вы не можете использовать case
таким образом, вы должны использовать or
:
select asl.Production_Group,asl.last_sequence_nbr
from ASSEMBLY_LINE asl
where( (ass_line='551F' and asl.assembly_line in('551F','551C','551S')
or (asl.assembly_line=ass_line)
);
Комментарии:
1. Спасибо за ответ. Но он показывает ту же ошибку.
2. Это потому, что вы не можете выбрать в переменной курсора (см. Комментарий Николаса к вашему вопросу)
3. .Так могу ли я использовать вложенную таблицу?
4. Да, или вы можете написать
open curs for <your select statement>
.5. @BabyboBNukes Да, ваш SQL по-прежнему неверен, как сказано в моем ответе!
Ответ №3:
Вы должны использовать:
where (ass_line = '551F' and asl.assembly_line in('551F','551C','551S')) or
(ass_line != '551F' and asl.assembly_line = ass_line)