DECLARE
  --select t.*, t.rowid from b_test t;
  -- Local variables here
  CURSOR UPDATE_CURSOR IS
    SELECT T.*, T.ROWID FROM B_TEST T FOR UPDATE OF T.TABLE_NAME;
  T_ROW UPDATE_CURSOR%ROWTYPE;
  STR   VARCHAR2(2000);
  V_P   VARCHAR2(20);
  V_N   VARCHAR2(20);
  V_R   VARCHAR2(20);
BEGIN
  OPEN UPDATE_CURSOR;
  LOOP
    FETCH UPDATE_CURSOR
      INTO T_ROW;
    EXIT WHEN UPDATE_CURSOR%NOTFOUND;
    V_P := T_ROW.POT_CDE;
    V_R := T_ROW.ROWID;
    STR := ' UPDATE B_TEST T SET T.TABLE_NAME = ''' || T_ROW.TABLE_NAME ||
           '_B'' where Current of UPDATE_CURSOR and T.ROWID = ' V_R;
    DBMS_OUTPUT.PUT_LINE(STR);
    --EXECUTE IMMEDIATE STR;
    --COMMIT;
  
  END LOOP;
  CLOSE UPDATE_CURSOR;
END;
请高手给看看。
我的本意是想根据每行记录的ROWID更新对应的每一行,为什么不行?是我的思想有问题吗?应该怎么办?非常感谢!!!

解决方案 »

  1.   

    如果要通过游标更新或删除数据,在定义游标时一定要带有for update子句。另外不要用动态SQL
      

  2.   

    里面我好像用FOR UPDATE 了啊?
    为什么不用能用动态SQL?
    您能抽时间给解决一下呗?多谢!!!
      

  3.   

    为什么不直接
    UPDATE B_TEST T SET T.TABLE_NAMET = TABLE_NAME||'_B';
      

  4.   

    create table t(table_name varchar2(20));
    insert into t select 'name'||rownum from dual connect by rownum <= 50;
    commit;
    BEGIN
         for i in (select t.rowid, t.* from t t) loop
             update t set table_name = i.table_name||'_B' where rowid = i.rowid;
         END LOOP;
         commit;
    END;
    /
      

  5.   

    connect by rownum <= 50;
    ?是什么意思?
    楼5,大哥你太强了!希望能和你多交流!
      

  6.   

    这里面要注意的几个问题:
    0.where Current of的用法。
    1.rowid的类型。不要把问题复杂化了。