在游标中使用案例更新

时间:2018-07-12 15:44:31

标签: oracle plsql cursor case

我有2张桌子以下。一个是部门

   DEPT_NO DEPT_NAME                      DEPT_VALUE
---------- ------------------------------ ----------
        10 Chemistry                             100
        40 Physics                               600
        20 Mathematics                           200
        30 Biology                               300
        50 Cosmos                                550

另外一个已更新_dept b

      DEPT DEPT_NAME                      DEPT_UPDATED_VALUE
---------- ------------------------------ ------------------
        10 Chemistry                                                 
        20 Mathematics                                               
        30 Biology                                                   
        90 Astrology                                                 
        40 Numerology                                                
        50 Cosmos        

借助于光标,我想从第二个表updated_dept b中的a.dept_value更新列(a.dept_no=b.dept and a.dept_name=b.dept_name)中提取第一张表d中的dept_updated_value,并使用case。 如果找不到dept_nodept_name的组合,我想将dept_updated_value更新为0

我写了下面的代码,但是没有给出正确的结果。请帮助

declare
    v_dept dept.dept_no%type;
    v_dept_name dept.dept_name%type;
    v_dept_value dept.dept_value%type;

    cursor c_dept_update
    is 
        select dept_no, dept_name, dept_value from dept;
begin
    open c_dept_update;

    loop
        fetch c_dept_update into v_dept,v_dept_name, v_dept_value;
        exit when c_dept_update%notfound;

        update dept_updated
        set    dept_updated_value=
               case 
                   when dept=v_dept and dept_name=v_dept_name
                       then v_dept_value
                   else 0
               end;

        commit;
    end loop;

    close c1;
end;

结果是这样的

DEPT DEPT_NAME                                DEPT_UPDATED_VALUE
---------- ---------------------------------- ------------------
        10 Chemistry                                           0
        20 Mathematics                                         0
        30 Biology                                             0
        90 Astrology                                           0
        40 Numerology                                          0
        50 Cosmos                                            550

1 个答案:

答案 0 :(得分:0)

释义Steven Feuerstein,不要一味地做SQL中可以做的事情。因此,我将在可更新的嵌入式视图中加入表。我尚未对此进行测试,因此可能需要进行调整:

UPDATE ( SELECT b.dept, b.dept_name, b.dept_updated_value, a.dept AS dept2
           FROM updated_dept b
           LEFT JOIN dept a ON a.dept = b.dept AND a.dept_name = b.dept_name )
   SET dept_updated_value = NVL( dept2, 0 )