Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 ORA-06503: PL/SQL: Function returned without value  [new]
Andrew__Z
Member

Откуда:
Сообщений: 18
Есть такая функция:
create or replace function get_line_unit(p_id app_org_unit_1.id%TYPE)
return app_org_unit_1.id%TYPE
is
v_type app_org_unit_1.org_unit_type_id%TYPE;
v_id app_org_unit_1.id%TYPE;
begin
v_id:=p_id;
select org_unit_type_id into v_type from app_org_unit where id=v_id;
if v_type in (1,4,5,6,7,8,10,11) then
return v_id;
elsif v_type not in (1,4,5,6,7,8,10,11) then
while(v_type not in (1,4,5,6,7,8,10,11))
LOOP
select id,org_unit_type_id into v_id,v_type from app_org_unit where id=(select parent_id from app_org_unit where id=v_id);
END LOOP;
return v_id;
end if;
exception
when no_data_found then
return null;
end;

Почему иногда при вызове такой ф-ции возникает ORA-06503??
9 фев 12, 15:04    [12062909]     Ответить | Цитировать Сообщить модератору
 Re: ORA-06503: PL/SQL: Function returned without value  [new]
Alexander Konakov
Member

Откуда:
Сообщений: 1027
Andrew__Z,

Включаю хрустальный шар: ошибка в случае NULL на входе? Замените ELSIF на ELSE
9 фев 12, 15:14    [12063029]     Ответить | Цитировать Сообщить модератору
 Re: ORA-06503: PL/SQL: Function returned without value  [new]
Alexander Konakov
Member

Откуда:
Сообщений: 1027
Alexander Konakov,

А ещё лучше - сразу его (NULL) ловите.
9 фев 12, 15:15    [12063039]     Ответить | Цитировать Сообщить модератору
 Re: ORA-06503: PL/SQL: Function returned without value  [new]
Vint
Member

Откуда: Москва
Сообщений: 4564
Andrew__Z,

IF v_type IN (1, 4, 5, 6, 7, 8, 10, 11)
ELSIF v_type NOT IN (1, 4, 5, 6, 7, 8, 10, 11)

Это пять) или даже пять с половиной)
Action: Rewrite PL/SQL function, making sure that it always returns a value of a proper type.
9 фев 12, 15:15    [12063041]     Ответить | Цитировать Сообщить модератору
 Re: ORA-06503: PL/SQL: Function returned without value  [new]
dec28
Member

Откуда: Харьков
Сообщений: 1
Andrew__Z,

  if v_type in (1,4,5,6,7,8,10,11) then
   return v_id;
  elsif v_type not in (1,4,5,6,7,8,10,11) then
   ...
   return v_id;
  -- else (v_type is null) 
  -- return ??
  end if;


видимо так
9 фев 12, 15:23    [12063130]     Ответить | Цитировать Сообщить модератору
 Re: ORA-06503: PL/SQL: Function returned without value  [new]
Andrew__Z
Member

Откуда:
Сообщений: 18
Alexander Konakov,
поменял на :
create or replace function get_line_unit(p_id app_org_unit_1.id%TYPE)
return app_org_unit_1.id%TYPE
is
v_type app_org_unit_1.org_unit_type_id%TYPE;
v_id app_org_unit_1.id%TYPE;
begin
if p_id is null then
return null;
end if;
v_id:=p_id;
select org_unit_type_id into v_type from app_org_unit where id=v_id;
if v_type in (1,4,5,6,7,8,10,11) then
return v_id;
elsif v_type not in (1,4,5,6,7,8,10,11) then
while(v_type not in (1,4,5,6,7,8,10,11))
LOOP
select id,org_unit_type_id into v_id,v_type from app_org_unit where id=(select parent_id from app_org_unit where id=v_id);
END LOOP;
return v_id;
end if;
exception
when no_data_found then
return null;
end;
Но ошибка вылетает всеравно...((
9 фев 12, 16:15    [12063840]     Ответить | Цитировать Сообщить модератору
 Re: ORA-06503: PL/SQL: Function returned without value  [new]
Vint
Member

Откуда: Москва
Сообщений: 4564
Andrew__Z,
и что же ты поменял в своем быдлокоде?)
найди для себя тэг SRC
9 фев 12, 16:18    [12063865]     Ответить | Цитировать Сообщить модератору
 Re: ORA-06503: PL/SQL: Function returned without value  [new]
-2-
Member

Откуда:
Сообщений: 15330
Andrew__Z
вылетает всеравно...((
пробовал котлеты,
пробовал конфеты.
вылетает все равно
из жопы автора говно.
9 фев 12, 16:22    [12063901]     Ответить | Цитировать Сообщить модератору
 Re: ORA-06503: PL/SQL: Function returned without value  [new]
Alexander Konakov
Member

Откуда:
Сообщений: 1027
Andrew__Z,

Где проверка v_type на NULL?
9 фев 12, 16:23    [12063909]     Ответить | Цитировать Сообщить модератору
 Re: ORA-06503: PL/SQL: Function returned without value  [new]
Andrew__Z
Member

Откуда:
Сообщений: 18
Vint,

а ты посмотри внимательнее
9 фев 12, 16:31    [12064007]     Ответить | Цитировать Сообщить модератору
 Re: ORA-06503: PL/SQL: Function returned without value  [new]
grey_narn
Member

Откуда: Алма-Ата, Казахстан
Сообщений: 178
Andrew__Z
Vint,

а ты посмотри внимательнее

Смотрю, не вижу. Ну ладно,
if p_id is null then
    return null;
  end if;

проверили, а дальше - кто вам сказал, что при неNULLовом p_id вот это обязано вернуть не NULL:
  select org_unit_type_id
  into   v_type
  from   app_org_unit
  where  id = v_id;

Ну и
elsif v_type not in (1,4,5,6,7,8,10,11) then
while(v_type not in (1,4,5,6,7,8,10,11))
- это прекрасно :D
9 фев 12, 16:36    [12064065]     Ответить | Цитировать Сообщить модератору
 Re: ORA-06503: PL/SQL: Function returned without value  [new]
Vint
Member

Откуда: Москва
Сообщений: 4564
Andrew__Z,
думаешь сложно найти в твоем быдлокоде ошибку которую ты так и не исправил? я тебя ткнул в нее еще в первом сообщении. а ты упёрто тупиш)
9 фев 12, 16:37    [12064090]     Ответить | Цитировать Сообщить модератору
 Re: ORA-06503: PL/SQL: Function returned without value  [new]
grey_narn
Member

Откуда: Алма-Ата, Казахстан
Сообщений: 178
Ну и
elsif v_type not in (1,4,5,6,7,8,10,11) then
while(v_type not in (1,4,5,6,7,8,10,11))
- это прекрасно :D[/quot]
Замечание снято, был неправ, погорячился.
9 фев 12, 16:42    [12064151]     Ответить | Цитировать Сообщить модератору
 Re: ORA-06503: PL/SQL: Function returned without value  [new]
Alexander Konakov
Member

Откуда:
Сообщений: 1027
grey_narn
Замечание снято, был неправ, погорячился.

Ну и напрасно. При NULL в v_type до WHILE дело не дойдёт.
9 фев 12, 16:44    [12064181]     Ответить | Цитировать Сообщить модератору
 Re: ORA-06503: PL/SQL: Function returned without value  [new]
Vint
Member

Откуда: Москва
Сообщений: 4564
grey_narn, то есть ты предпочитаешь говнокод с циклами и постоянным передёргиванием запроса вместо написания одного простенького иерархического запроса? это ж очередной бугагашка который рекурсивно ищет какой то признак в иерархии)
9 фев 12, 17:14    [12064557]     Ответить | Цитировать Сообщить модератору
 Re: ORA-06503: PL/SQL: Function returned without value  [new]
grey_narn
Member

Откуда: Алма-Ата, Казахстан
Сообщений: 178
Vint
grey_narn, то есть ты предпочитаешь говнокод с циклами и постоянным передёргиванием запроса вместо написания одного простенького иерархического запроса? это ж очередной бугагашка который рекурсивно ищет какой то признак в иерархии)

Да не в этом дело. Я просто очень второпях пробежался по коду, и мне показалось, там внутри цикла вообще значение v_type не меняется, то есть мысленно я приписал ТС какую-то совсем уж запредельную глупость :-). Так-то понятно, что есть connect_by и if там не нужен.
9 фев 12, 17:39    [12064799]     Ответить | Цитировать Сообщить модератору
 Re: ORA-06503: PL/SQL: Function returned without value  [new]
Andrew__Z
Member

Откуда:
Сообщений: 18
Vint,

при иерархическом запросе в данном случае, ты получиш несколько строк с искомым признаком, а тебе нужна только одна, ближайшая. Запрос можно написать , не спорю, но это будет не "простой запросик". это будет нагромождение из нескольких подзапросов.
9 фев 12, 20:12    [12065766]     Ответить | Цитировать Сообщить модератору
 Re: ORA-06503: PL/SQL: Function returned without value  [new]
Elic
Member

Откуда:
Сообщений: 29979
Andrew__Z
при иерархическом запросе в данном случае, ты получиш несколько строк с искомым признаком, а тебе нужна только одна, ближайшая. Запрос можно написать , не спорю, но это будет не "простой запросик". это будет нагромождение из нескольких подзапросов.
Ты просто не умеешь писать иерархические запросы.
9 фев 12, 20:18    [12065809]     Ответить | Цитировать Сообщить модератору
 Re: ORA-06503: PL/SQL: Function returned without value  [new]
Vint
Member

Откуда: Москва
Сообщений: 4564
Andrew__Z,
просто признай что ты не умеешь готовить))) и "нагромождения" sql мне нравится больше чем говнокод на pl\sql
9 фев 12, 22:51    [12066276]     Ответить | Цитировать Сообщить модератору
 Re: ORA-06503: PL/SQL: Function returned without value  [new]
grey_narn
Member

Откуда: Алма-Ата, Казахстан
Сообщений: 178
Andrew__Z
при иерархическом запросе в данном случае, ты получиш несколько строк с искомым признаком, а тебе нужна только одна, ближайшая. Запрос можно написать , не спорю, но это будет не "простой запросик". это будет нагромождение из нескольких подзапросов.

Да нет там никакого нагромождения, запрос на 5 строк:
with app_org_unit as ( select 1 as id, 2 as parent_id, 3 as org_unit_type_id from dual union all
                       select 2 as id, 3 as parent_id, 4 as org_unit_type_id from dual union all
                       select 3 as id, null as parent_id, 4 as org_unit_type_id from dual union all
                       select 4 as id, null as parent_id, 3 as org_unit_type_id from dual union all
                       select 5 as id, 6 as parent_id, null as org_unit_type_id from dual union all                           
                       select 6 as id, null as parent_id, 4 as org_unit_type_id from dual)
select aou.id
from app_org_unit aou
where org_unit_type_id in (1,4,5,6,7,8,10,11)
connect by id = prior parent_id and prior org_unit_type_id not in (1,4,5,6,7,8,10,11)
start with id = p_id;

Вам остается только в одно место nvl воткнуть, чтобы при p_id = 5 (как раз случай, на котором ваша функция валится и этот запрос работает некорректно) тоже все ОК было :)
10 фев 12, 07:32    [12066876]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить