oracle - 计算表中的记录并使用游标更新表

标签 oracle

我在 Oracle 中有以下表:

Teacher
id_teacher (pk)
number_courses

Course
id_course (pk)
id_teacher (fk)

我想创建一个游标,通过计算教师分配的类(class)来更新 Teacher 表中的 number_courses 字段。据我所知,我应该首先声明一个这样的游标:

cursor c_teacher IS
        select id_teacher from teacher;

然后执行一个 for 循环,迭代此光标的结果并计算分配的类(class),我的解决方案草案是:

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;

最佳答案

不要使用光标。 (除非这是您面临的实际问题的极大简化。或者这是一个考虑不周的家庭作业问题。在这种情况下, secret 是 update where current of )

带有相关子查询的单个更新语句即可完成这项工作:

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

由于值不会不同步,可能更好的是不在教师表中存储类(class)数量并在需要时计算正确的值:

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;

关于oracle - 计算表中的记录并使用游标更新表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33840066/

相关文章:

mysql - 来自 MySQL,前往 Oracle : the Pitfalls

oracle - 如何在oracle home中创建目录

c# - 使用 ODP.NET (C#) 将对象传递给 oracle 包中的过程时必须使用哪种数据库类型?

oracle - 执行动态 PL/SQL block 以执行求和并返回值

oracle - 如何使用Oracle的LISTAGG函数和独特的过滤器?

oracle - 如何在 View 中创建非空列

sql - 带有时间戳的 Oracle 截断

Java日期长值插入后改变,选择查询

linux - linux 上 oracle 的远程客户端

空值上的 SQL "Join"