两个表 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.   

    两个表
    SQL> select * from a;               
                                                              
      ID 201201 201202                
    ---- ------ ------                                
       1     10                                       
       5               20                                        
    SQL> select * from b;      
                                                              
      ID   MONTH ZU_NO          
       ---- ------- -----          
        5  201202    15          
                                            
    想要达到的效果
       ID 201201 201202
    ---- ------ ------
       1     10 
       5            15 
      

  2.   

    解决好不容易
     create or replace  procedure tongji is
       p_month     number;
       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';
       EXECUTE IMMEDIATE sql_str;
       --dbms_output.put_line(sql_str);---引入了这个很关键,调试时可以看到语句执行的效果
       --USING p_month;
       commit;
    END ;
      通过引入了dbms_output.put_line(sql_str),存储过程编译成功后,通过设置set serverout on,
      执行存储过程发现原先设置的sql_str结果为“update a set 201202=8”,201202没有用“”引起来所
      以失败,找到原因后对原存储过程进行修改为“sql_str:='update a set "'||p_month||'"=8';”,并增加了事务提交commit; 使问题得到完美解决,下一步是想法对a表和b表进行关联或通过游标实现b表对应的ID去修改a表同样ID下变量的值,胜利在望了,特此总结一下!