Как вызвать исключение внутри CASE выражения?
Вот упрощённо то, что хочу сделать:
declare
res int;
function foo (x int) return int is
begin
return case x when between 1 and 99 then x
else raise value_error end;
end;
begin
res := foo (100);
end;
/
Но это поему-то не компилируется:
PLS-00103: Encountered the symbol "VALUE_ERROR" when expecting one of the following:
[длинный список, что компилятор ожидал]
Можно конечно добавить строкой выше IF, но так же проще написать.
Ответы (1 шт):
Автор решения: 0xdb
→ Ссылка
CASE выражение (expression) после THEN ожидает выражение, которое может вернуть значение. Предложение RAISE им не является.
Создайте функцию, которая вызовет исключение:
create or replace function raiseErr (errm varchar2, errn int:=20000) return int is
begin
raise_application_error (-errn, errm);
end;
/
Заметьте, отсутствие return в реализции, эта функция только "обещает" вернуть, но никогда ничего не вернёт.
Так будет работать:
declare
res int;
function foo (x int) return int is
begin
return case when x between 1 and 99 then x
else raiseErr ('Illegal value '||x) end;
end;
begin
res := foo (100);
end;
/
Error report -
ORA-20000: Illegal value 100