有两个表  the_d_exam_result_item (exam_result_item_id,exam_result_frame_id)
          the_d_exam_result_frame(exam_result_item_id,exam_result_frame_id)
其中the_d_exam_result_item 中的exam_result_frame_id表没有数据
我想根据表the_d_exam_result_frame的数据,插入到the_d_exam_result_item中
请问下面的代码应该怎么改
declare 
v_item_id number;
v_frame_id number;
CURSOR cur_cursor
is
select exam_result_item_id from the_d_exam_result_item;
begin
  open cur_cursor;
  loop
     fetch  cur_cursor  into  v_item_id; 
        begin
      --if  ( select count(1) from the_d_exam_result_frame where exam_result_item_id = v_frame_id ) >0  then
            select exam_result_frame_id into v_frame_id from the_d_exam_result_frame where exam_result_item_id = v_frame_id;
        --end if;
            update the_d_exam_result_item set exam_result_id= v_frame_id where EXAM_RESULT_ITEM_ID = v_item_id;
            commit; 
        end;
     exit when cur_cursor%notfound;
  end loop;
end;

解决方案 »

  1.   


    --哥們,你這是重復帖唉
    declare  
    v_item_id number;
    v_frame_id number;
    CURSOR cur_cursor
    is
    select exam_result_item_id from the_d_exam_result_item;
    begin
      open cur_cursor;
      loop
      fetch cur_cursor into v_item_id;    exit when cur_cursor%notfound;
      --begin
      --if ( select count(1) from the_d_exam_result_frame where exam_result_item_id = v_frame_id ) >0 then
      execute immediate 'select exam_result_frame_id from the_d_exam_result_frame where exam_result_item_id =:1'
    into v_frame_id
    using v_item_id;
      --end if;
    --exam_result_id改為exam_result_frame_id,因你提供的表結構是這個列
      update the_d_exam_result_item set exam_result_frame_id= v_frame_id where EXAM_RESULT_ITEM_ID = v_item_id;
      --commit;  
      --end;
      end loop;
      commit;--只能放到loop外層
    end;
    /
      

  2.   

    问下,,报01403错误select exam_result_frame_id from the_d_exam_result_frame where exam_result_item_id = :1
    这行有的时候会找不到数据,,,请问应该怎么改啊
      

  3.   

    oracle检查是否有记录怎么用的啊?是if exists吗?   能不能帮我改下啊
      

  4.   


    --聲明個變量,取記錄倏數,如果存在,則執行,不存在,不執行
    declare  
    v_item_id number;
    v_frame_id number;
    CURSOR cur_cursor
    is
    select exam_result_item_id from the_d_exam_result_item;
    v_count int:=0;
    begin
      open cur_cursor;
      loop
      fetch cur_cursor into v_item_id;    exit when cur_cursor%notfound;
      --begin
      --if ( select count(1) from the_d_exam_result_frame where exam_result_item_id = v_frame_id ) >0 then
      execute immediate 'select count(*) from the_d_exam_result_frame where exam_result_item_id =:1'
    into v_count
    using v_item_id;
    if v_count<>0 then 
      execute immediate 'select exam_result_frame_id from the_d_exam_result_frame where exam_result_item_id =:1'
    into v_frame_id
    using v_item_id;
      --end if;
    --exam_result_id改為exam_result_frame_id,因你提供的表結構是這個列
      update the_d_exam_result_item set exam_result_frame_id= v_frame_id where EXAM_RESULT_ITEM_ID = v_item_id;
      --commit;  
      --end;
    end if;
      end loop;
      commit;--只能放到loop外層
    end;
    /
      

  5.   

    oracle沒有這種判斷,只有在表關聯時才有這種判斷
      

  6.   

    问下,,,我就是应为数据量很大才这么改的,,,我想update一次就更新一次,,,,请问commit应该写在哪里啊?
      

  7.   

    还有人吗???????? 帮我看看这个COMMIT应该写在哪里啊?
      

  8.   

    还有人吗???????? 帮我看看这个COMMIT应该写在哪里啊?
      

  9.   

    帮你简化下吧,你整的实在太复杂了--你调用批次更新的sp,至于更新多少自已传值进去
    create or replace procedure zhuzhusex7984_upd(
    v_rows int:=1000
    )
    as
    v_sql varchar(4000) := 'update the_d_exam_result_item 
    set exam_result_frame_id=(select exam_result_frame_id
    from the_d_exam_result_frame b
    where the_d_exam_result_item.exam_result_item_id=b.exam_result_item_id
    and the_d_exam_result_item.exam_result_frame_id<>b.exam_result_frame_id)
    where rownum<:1 and exists(select 1 from the_d_exam_result_frame c where
    the_d_exam_result_item.exam_result_item_id=c.exam_result_item_id
    and the_d_exam_result_item.exam_result_frame_id<>c.exam_result_frame_id)';
    begin
    execute immediate v_sql
    using v_rows;
    commit;
    end;
    /
    --执行批次更新
    declare 
    v_rows int := 0;
    v_sql varchar2(4000) :='select count(1) from the_d_exam_result_item a,the_d_exam_result_frame b 
    where a.exam_result_item_id=b.exam_result_item_id
    and a.exam_result_frame_id<>b.exam_result_frame_id';
    begin
    loop
    execute immediate v_sql
    into v_rows;
    exit when v_rows=0;
    zhuzhusex7984_upd;
    --zhuzhusex7984_upd(10000);--如果需要根据你记录的多少传入每次更新的记录数量就可以了
    end loop;
    end;
    /
      

  10.   

    你執行一次更新10萬倏吧,看下什麼結果,是否可以正常執行exec zhuzhusex7984_upd(100000);
      

  11.   


    --執行下面這句,看下有多少倏記錄
    select count(1) from the_d_exam_result_item a,the_d_exam_result_frame b 
        where a.exam_result_item_id=b.exam_result_item_id
                and a.exam_result_frame_id<>b.exam_result_frame_id;