2015-01-20 1 views
0

У меня есть эти 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, но затем он жалуется на исключение не быть в нужном месте ...

ответ

0

Это должно решить проблему:

-- look for already created category for current thing 
begin 
    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; 
exception when no_data_found then 
    v_category_name_id := null; 
end; 
+0

Да, это так, я забыл использовать начать/конец внутри петля. Используя его, я могу объявить блок исключений. – diminuta