2015-11-21 3 views
2

У меня есть следующие таблицы в Oracle:Подсчет записей в таблице и обновление таблицы с помощью курсора

Teacher 
id_teacher (pk) 
number_courses 

Course 
id_course (pk) 
id_teacher (fk) 

Я хотел бы создать курсор, который обновляет number_courses поля из Teacher таблицы путем подсчета курсов учитель был назначен. За то, что я знаю, что я должен сначала объявить курсор, как это:

cursor c_teacher IS 
     select id_teacher from teacher; 

А потом сделать для петли Перебор результатов от этого курсора и подсчета назначенных курсов, проект моего решения является:

declare 
    countC number(2); 
    cursor c_teacher IS 
     select id_teacher from teacher; 
begin 
    for data in c_teacher 
    loop 
     select count(id_teacher) into countC from Course where id_teacher=data; 
     --I can output here with a DMBS_OUTPUT only to see if its working, but 
     --I need to use an UPDATE instruction 
    end loop; 
end; 

ответ

2

Не используйте курсор. (. Если это не является резким упрощением реальной проблемы, которую вы столкнулись Или это плохо продумана проблема домашнего задания В этом случае секрет update where current of.)

Единый оператор обновления с коррелированными подзапросами будут делать работу:

update Teachers T 
set number_courses = (select count(*) 
    from Courses C 
    where C.id_teacher = T.id_teacher); 

Что, вероятно, будет еще лучше, потому что ценности не могут выйти из синхронизации, чтобы не хранить количество курсов в таблице учителей и вычислить правильное значение, когда это необходимо:

alter table Teachers drop column number_courses; 

create view Teachers_VW as 
select T.id_teacher 
    , count(*) as number_courses 
from Teachers T 
left outer join Courses C on C.id_teacher = T.id_teacher 
group by T.id_teacher;