两个表 a,b
SQL> select * from a;         SQL> select * from b;       
                                                          
  ID 201201   201202                        ID   MONTH    ZU_NO          
---- ------ ------                            ---- ------- -----          
   1     10                                   5  201202    15          
   5            20                                        
  通过存储过程实现根据b表的month字段的值去修改a表和month字段一样的,id一样的这个数值,得到以下结果
  ID 201201 201202
---- ------ ------
   1     10 
   5            15 经过循序渐进现在情况是这样的                                               
   create or replace procedure tongji is
  p_month     varchar2(6);
   p_id        number(3);
   p_zu        number(3);
BEGIN
   select id,month,zu_no into p_id,p_month,p_zu from b;   对
   update a set id=p_zu ;                          对
   update b set p_id='5';           错
   update b set p_month=p_zu;     更错
END ;经多方查找资料在以表名、列名为变量修改时,只能用动态sql了create or replace  procedure tongji is
   p_month     varchar2(6);
   p_id        number(3);
   p_zu        number(3);
   yuan        varchar2(200);
   sql_str     varchar(2000);
BEGIN
   select id,month,zu_no into p_id,p_month,p_zu from b ;
   sql_str:='update a set '||p_month||'=8';
   
END ;
到这一步时可以编译成功,但是执行没结果,不能达到修改a表的把从b表选的”201202“字段列,数值修改为8,只有实现了这一步,以后才能用到游标进行遍历修改使用占位符来当列名的变量
create or replace  procedure tongji is
   p_month     varchar2(6);
   p_id        number(3);
   p_zu        number(3);
   yuan        varchar2(200);
   sql_str     varchar(2000);
BEGIN
   select id,month,zu_no into p_id,p_month,p_zu from b ;
   sql_str:='update a set '||:1||'=8';
   EXECUTE IMMEDIATE sql_str
   USING p_month;
END ;

解决方案 »

  1.   

    看不懂楼主想要结果
     ID 201201 201202 ID MONTH ZU_NO   
    ---- ------ ------ ---- ------- -----   
      1 10 5 201202 15 
    上面b表的id是哪个?
    10是201201?5是201202?
      

  2.   

    谢谢,它这显示有问题
      SQL> select * from a;
     
      ID 201201 201202
    ---- ------ ------
       1     10      7
       5             7
     
    SQL> select * from b;
     
      ID   MONTH ZU_NO
    ---- ------- -----
       5  201202    15
     
    SQL> 现在我已经通过存储过程实现了,现在正在处理如果B表有多条记录的情况,使用到了游标,请协助
       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 ;
    SQL> show error
    Errors for PROCEDURE YUANDB.TONGJI:
     
    LINE/COL ERROR
    -------- ------------------------------------------------------------------------------------------------
    6/20     PLS-00103: 出现符号 "IS"在需要下列之一时:   := . ( @ % ; not null range     default character  
       
      

  3.   

    Rcursor cursor1 is select id,month,zu_no into p_id,p_month,p_zu from b_bak ;   Rcursor 是什么东西 你的数据库能识别它吗。
      

  4.   

    彻底解决!!庆祝!!!
      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 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 ;
      

  5.   

    merge into a
    using b
    on (a.id = b.id)
    when matched then
       update set a.month = b.p_zu用b表更新a表,有这样的语法,不需要用过程