Oracle 触发器,函数,过程调用出问题了 帮帮忙

Smile_Liber 2011-03-26 07:39:53
我导入数据到userinfo_temp后触发触发器USERINFO_TEMP_ADD
更新USERINFO表

出现错误:
ORA-04091: 表 RONGHE.USERINFO 发生了变化, 触发器/函数不能读它
ORA-06512: 在 "RONGHE.SELECT_USE_ITEMS_RECORD", line 8
ORA-06512: 在 "RONGHE.PR_USERINFO_NEW_ADD", line 3
ORA-06512: 在 "RONGHE.USERINFO_TEMP_ADD", line 2
ORA-04088: 触发器 'RONGHE.USERINFO_TEMP_ADD' 执行过程中出错

触发器---------------------------------------------------
create or replace TRIGGER USERINFO_TEMP_ADD
AFTER INSERT ON USERINFO_TEMP
BEGIN
pr_userinfo_new_add;
END;
过程------------------------------------------------------
create or replace PROCEDURE PR_USERINFO_NEW_ADD AS
BEGIN

MERGE INTO userinfo u
USING userinfo_temp ut
ON (u.name = ut.name and u.USE_ITEMS = ut.USE_ITEMS )
WHEN MATCHED THEN
UPDATE
SET u.sex = ut.sex, u.cred_name = ut.cred_name, u.cred_number = ut.cred_number,
u.MARITAL_STATUS = ut.MARITAL_STATUS,u.ANNUAL_INCOME=ut.ANNUAL_INCOME,u.CONTACT_STATUS = ut.CONTACT_STATUS,
u.USE_ITEMS_RECORD = select_use_items_record(ut.NAME,ut.USE_ITEMS,ut.USE_ITEMS)
WHERE u.cred_number = ut.cred_number
when not matched then
insert (u.NAME, u.SEX, u.CRED_NAME, u.CRED_NUMBER, u.MARITAL_STATUS, u.ANNUAL_INCOME, u.CONTACT_STATUS, u.USE_ITEMS)
values(ut.NAME, ut.SEX, ut.CRED_NAME, ut.CRED_NUMBER, ut.MARITAL_STATUS, ut.ANNUAL_INCOME, ut.CONTACT_STATUS, ut.USE_ITEMS)
where ut.name not in (select name FROM userinfo);
END PR_USERINFO_NEW_ADD;

函数------------------------------------------------------
create or replace FUNCTION SELECT_USE_ITEMS_RECORD
( IN_NAME IN VARCHAR2, IN_USE_ITEMS IN VARCHAR2, IN_USE_ITEMS_RECORD IN VARCHAR2
) RETURN VARCHAR2 AS
userinfo_id INTEGER;
sel_use_items_record VARCHAR2(40);
instr_number INTEGER;
BEGIN
select id INTO userinfo_id FROM userinfo WHERE name = in_name AND use_items = in_use_items;
select use_items_record INTO sel_use_items_record FROM userinfo WHERE id= userinfo_id;
select instr(sel_use_items_record, in_use_items_record) INTO instr_number from dual;
if instr_number = 0 then
begin
sel_use_items_record := sel_use_items_record || '-' || in_use_items_record;
end;
end if;
RETURN sel_use_items_record;
END SELECT_USE_ITEMS_RECORD;
...全文
265 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
Smile_Liber 2011-03-29
  • 打赏
  • 举报
回复
世界变安静了?
Smile_Liber 2011-03-27
  • 打赏
  • 举报
回复
谁能说明下 在过程中 NEW 表示的含义 最好能讲详细些的,我在GOOGLE搜索了很多都提到这个 NEW
Smile_Liber 2011-03-27
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 huangdh12 的回复:]
还有是 USERINFO 的表结构变化是否删除了 你需要访问的列?
[/Quote]

我是导入数据用的 表的结构都没变化
  • 打赏
  • 举报
回复
应该是变异表问题
你google下"表 RONGHE.USERINFO 发生了变化, 触发器/函数不能读它"
这个错误提示就能得到好多文章
hyee 2011-03-27
  • 打赏
  • 举报
回复
绝大多数情况下,你在触发器内部不能调用它所依赖的表userinfo_temp本身,即使你是使用存储过程间接调用
huangdh12 2011-03-26
  • 打赏
  • 举报
回复
还有是 USERINFO 的表结构变化是否删除了 你需要访问的列?
huangdh12 2011-03-26
  • 打赏
  • 举报
回复
你是 用导入导出数据库吗? 重新编译一下触发器 ,存储过程 试试。

17,089

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧