执行下面一个简单语句:
update
  tbl_s1_m5_department t
set
  t.dm_re = pkg_s1_soa_commons.get_department_fullname(t.dm_id)
由于pkg_s1_soa_commons.get_department_fullname(t.dm_id)获取的还是tbl_s1_m5_department 的值。所以报如下错误:
---------------------------
Error
---------------------------
ORA-04091: 表 SAL_MATERIAL.TBL_S1_M5_DEPARTMENT 发生了变化,触发器/函数不能读
ORA-06512: 在"SAL_MATERIAL.PKG_S1_M5_DEPARTMENT", line 62
ORA-06512: 在"SAL_MATERIAL.PKG_S1_SOA_COMMONS", line 372
ORA-06512: 在line 1
View program sources of error stack?
---------------------------
是(Y)   否(N)   
---------------------------问:实际中,我只想修改字段t.dm_re,pkg_s1_soa_commons.get_department_fullname(t.dm_id)获取的值与该字段没有关系。能否有特殊的处理方式,完成该update?

解决方案 »

  1.   

    定义一个cursor,一条一条地update吧
      

  2.   

    先把pkg_s1_soa_commons.get_department_fullname(t.dm_id) 的值取到一个变量中,再在update中引用这个变量
      

  3.   


    --TRY IT
    DECLARE
    ID NUMBER;
    BEGIN
        SELECT pkg_s1_soa_commons.get_department_fullname(tbl_s1_m5_department.dm_id) INTO ID FROM DUAL;
        UPDATE tbl_s1_m5_department T
        SET T.dm_re =ID;
        COMMIT;
    END;
      

  4.   

    举例试试?
    一个update好像没办法做到吧!
      

  5.   

    这个是个字段不是变量tbl_s1_m5_department.dm_id,没法编译通过!
      

  6.   

    ..修改一下不就好了?DECLARE
    ID NUMBER;
    BEGIN
        SELECT pkg_s1_soa_commons.get_department_fullname(tbl_s1_m5_department.dm_id) INTO ID FROM tbl_s1_m5_department;
        UPDATE tbl_s1_m5_department T
        SET T.dm_re =ID;
        COMMIT;
    END;
    PS:如果问题还是得不到解决,那你就说说你的这个包是用来干什么的?返回一个还是多个,什么类型的结果值
      

  7.   

    这种情况没法用一条update解决,只能用一个cursor或用存储过程解决。总之得分两步,第一步先把要更新的值取出来,第二步实施更新。
      

  8.   


    tbl_s1_m5_department.dm_id这个是字段。可能是多值。简单的into肯定出问题。
    它的目的就是通过该部门id,获取整个部门路径的名称!
      

  9.   

    贴出get_department_fullname代码看看
      

  10.   

    最后这样处理:
      procedure update_deparment is
      v_cur pkg_s1_soa_commons.t_cursor;
      v_id int;
      v_re varchar2(32767);
      v_arr_id pkg_s1_soa_commons.t_integer_array;
      v_arr_memo pkg_s1_soa_commons.t_string_array;
      begin
        select
          t.dm_id,
          pkg_s1_soa_commons.get_department_fullname(t.dm_id)
        bulk collect into
          v_arr_id,
          v_arr_memo
        from
          tbl_s1_m5_department t;
          
        forall i in v_arr_memo.first..v_arr_memo.last
        update
          tbl_s1_m5_department t
        set
          t.dm_re = v_arr_memo(i)
        where
          t.dm_id = v_arr_id(i);
      end update_deparment;