oracle触发器错误。表发生了变化,触发器不能读它

shmilyxin2009 2010-04-11 02:04:03
把触发器代码贴上,请问下以下写法哪里出的问题呢?

CREATE OR REPLACE TRIGGER MAP_UPDATE_ALARM
BEFORE UPDATE OF TS_ID,MAPPING_RULE ON FEATURE_MAP
FOR EACH ROW

DECLARE
V1 FEATURE_MAP.TS_ID%TYPE;
V2 FEATURE_MAP.MAPPING_RULE%TYPE;
V3 FEATURE_MAP.MAPPING_RULE%TYPE;
PRO_NAME VARCHAR2(50);
BEGIN
SELECT :OLD.TS_ID,:OLD.MAPPING_RULE,:NEW.MAPPING_RULE
INTO V1,V2,V3
FROM FEATURE_MAP;

SELECT B.OBJECT_NAME
INTO PRO_NAME
FROM TRANS_STEP A,USER_OBJECTS B
WHERE A.OBJECT_ID=B.OBJECT_ID AND B.OBJECT_TYPE='PROCEDURE' AND A.TS_ID=V1;

INSERT INTO MODI_METADATA_ALARM_INFO
(before_update_info,after_update_info,to_be_modified_pro,modified_flag,update_time,update_user)
VALUES(V2,V3,PRO_NAME,'是',SYSDATE,USER);

END;
...全文
211 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
xieyu_zy 2010-04-11
  • 打赏
  • 举报
回复
题目不是很明确,所以只能从表面上看下,你说的表发生变化是结构发生变化?字段名称变化了还是字段删除了还是字段增加了还是字段长度变化了还是数据量变化了,不是很清楚,不过表结构发生变化,依赖的触发器一般都需要重新编译一下,从代码的角度我建议几点:
1、PRO_NAME 的类型应该是:USER_OBJECTS.OBJECT_NAME%type;应该是:VARCHAR2(128)
2、对于代码:
SELECT :OLD.TS_ID,:OLD.MAPPING_RULE,:NEW.MAPPING_RULE
INTO V1,V2,V3
FROM FEATURE_MAP;
我认为这个可能会出现多行的问题,当数据多行的时候,就像你用SELECT 1 FROM FEATURE_MAP;一样,若该表多行,肯定会返回多行1。

如果要用这种写法,可以这样写:
SELECT :OLD.TS_ID,:OLD.MAPPING_RULE,:NEW.MAPPING_RULE
INTO V1,V2,V3
FROM DUAL;
或者直接赋值(速度要快一些,SELECT INTO的效率比赋值要慢很多)。

3、如果字段长度或者类型发生变化,检查相应的表结构类型进行对比,如,插入的表MODI_METADATA_ALARM_INFO类型是否匹配上来源表的结构。
iqlife 2010-04-11
  • 打赏
  • 举报
回复
INSERT INTO MODI_METADATA_ALARM_INFO
(before_update_info,after_update_info,to_be_modified_pro,modified_flag,update_time,update_user)
VALUES(V2,V3,PRO_NAME,'是',SYSDATE,USER);

提示错误是什么
USER好像没有定义

3,492

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 高级技术相关讨论专区
社区管理员
  • 高级技术社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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