执行下面一个简单语句:
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?
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?
--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;
一个update好像没办法做到吧!
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:如果问题还是得不到解决,那你就说说你的这个包是用来干什么的?返回一个还是多个,什么类型的结果值
tbl_s1_m5_department.dm_id这个是字段。可能是多值。简单的into肯定出问题。
它的目的就是通过该部门id,获取整个部门路径的名称!
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;