begin
  for idx in (select *
                from (select t1.custom_no,
                             t1.addr,
                             t1.pk_port,
                             t2.b,
                             t2.c,
                             t2.e
                        from aempk t1
                        left join ttt t2
                          on t1.addr = t2.c) t3
               where t3.c is not null) loop
    execute immediate 'update aempk set pk_port=''' || idx.e ||
                         ''' where custom_no=''' || idx.custom_no ||
                         ''' and addr=''' || idx.addr || '''';
  end loop;
end;

解决方案 »

  1.   

    会不会是,引用列名的原因idx.e
      

  2.   

    同步更新
    用游标慢死你
    用merge into 吧
      

  3.   

    首先,我支持一下楼上,你这个程序用merge into 性能好,很简单就搞定了
    然后我们再针对你的过程来说明一下,你程序的问题吧
    先说程序结构应该这样:
    declare
    声明游标 corsor c_vvvv;
    begin
    for v_vvv in  c_vvvv
    loop
    执行过程
    end loop;
    end;
    1,你要把程序写的更容易读一些,不然别人看你的代码很累。
    2,然后你的程序中尽量不要写select *,这样对于写过程来说会引发灾难性问题
    3,动态SQL不是你这样写的, execute immediate ‘’中间不能有拼接的变量出现
    如果想要用变量,应该这样写
     execute immediate update aempk set pk_port=:1 where custom_no= :2 and addr=:3'
         using  idx.e,idx.custom_no,idx.addr ;
      

  4.   

    上面少写了一个单引号,不好意思
    execute immediate ‘update aempk set pk_port=:1 where custom_no= :2 and addr=:3'
      using idx.e,idx.custom_no,idx.addr ;
      

  5.   

    我发现了,不是这段程式的问题,而是里面查下的地址有一些是特殊符号,例如 -- 或者是 & 需要,能否改下,如果遇到这种则跳过,接着执行下一行。
      

  6.   

    谢谢你。。
    3,动态SQL不是你这样写的, execute immediate ‘’中间不能有拼接的变量出现
    如果想要用变量,应该这样写
      execute immediate update aempk set pk_port=:1 where custom_no= :2 and addr=:3'
       using idx.e,idx.custom_no,idx.addr ;这种的我没用过,1,2,3直接对应下面的using引用的变量吗?