У меня есть эти 3 таблиц в базе данных: - Person - Вещь - КатегорияPL исключение/SQL в цикле
«категория» таблица является новым, так что я должен написать сценарий для перенастройки данные. Раньше у человека могло быть много вещей ... теперь у человека может быть много категорий, и каждая категория может иметь много вещей.
Поэтому я должен написать сценарий, который выполняет итерации через вещи, и проверяет, была ли группа уже создана для этой вещи и человека, а если нет, создайте ее и обновите данные о вещи. Если категория уже создана, просто обновите данные о вещи.
declare
-- thing
v_thing_id thing.id%TYPE;
v_thing_person_id thing.person_id%TYPE;
v_thing_category_name thing.category_name%TYPE;
v_thing_category_id thing.category_id%TYPE;
-- category_name
v_category_id category.id%TYPE;
cursor c_thing_ids is
select b.id
from thing b
where category_id is null
;
begin
open c_thing_ids;
loop
-- iterate all the thing ids
fetch c_thing_ids into v_thing_id;
exit when c_thing_ids%NOTFOUND;
-- look for already created category for current thing
select e.id
into v_category_name_id
from category e
where e.person_id = v_thing_person_id
and e.category_name = v_thing_category_name;
-- if exists: update thing
if v_category_name_id is not null then
update thing
set category_id = v_category_name_id
where id = v_thing_id;
else
-- if not: create category and update thing
insert into category (id, category_name)
values (HIBERNATE_SEQUENCE.NEXTVAL, v_thing_category_name);
select e.id
into v_category_name_id
from category e
where e.person_id = v_thing_person_id
and e.category_name = v_thing_category_name;
update thing
set category_id = v_category_name_id
where id = v_thing_id;
end if;
end loop;
end;
Я не эксперт PL/SQL, на самом деле это второе, что я делаю с ним «в реальной жизни», так, как и ожидалось, я получаю сообщение об ошибке: ORA-01403 в строке:
select e.id
into v_category_name_id
from category e
where e.person_id = v_thing_person_id
and e.category_name = v_thing_category_name;
Как я должен справиться с этим? Я попытался с исключением, когда NO_DATA_FOUND, но затем он жалуется на исключение не быть в нужном месте ...
Да, это так, я забыл использовать начать/конец внутри петля. Используя его, я могу объявить блок исключений. – diminuta