create or replace  procedure tongji is
   p_month     number;
   p_id        varchar2(16);
   p_zu        number(3);
   sql_str     varchar(2000);
   Rcursor cursor1 is select id,month,zu_no into p_id,p_month,p_zu from b_bak ;  
BEGIN
   open cursor1
   loop 
   --select id,month,zu_no into p_id,p_month,p_zu from b_bak ;
   FETCH cursor1 INTO p_id,p_month,p_zu; 
   exit when cursor1%notfound;
  -- sql_str:='update a set "'||p_month||'"=8';
   sql_str:='update a_bak set "'||p_month||'"='||p_zu||' where a_bak.cstm_id='''||p_id||'''';
   EXECUTE IMMEDIATE sql_str;
   --USING p_id;
  -- dbms_output.put_line(sql_str);---引入了这个很关键,调试时可以看到语句执行的效果 
   end loop;
   close cursor1;
   commit;
END ;

解决方案 »

  1.   


    create or replace procedure tongji is
      p_month number;
      p_id    varchar2(16);
      p_zu    number(3);
      sql_str varchar(2000);
      cursor cursor1 is
        select id, month, zu_no into p_id, p_month, p_zu from b_bak; --rcursor改为cursor
    BEGIN
      open cursor1; --这里少了;号
      loop
        --select id,month,zu_no into p_id,p_month,p_zu from b_bak ;
        FETCH cursor1
          INTO p_id, p_month, p_zu;
        exit when cursor1%notfound;
        -- sql_str:='update a set "'||p_month||'"=8';
        sql_str := 'update a_bak set "' || p_month || '"=' || p_zu ||
                   ' where a_bak.cstm_id=''' || p_id || '''';
        EXECUTE IMMEDIATE sql_str;
        --USING p_id;
        -- dbms_output.put_line(sql_str);---引入了这个很关键,调试时可以看到语句执行的效果
      end loop;
      close cursor1;
      commit;
    END;