oracle触发器该怎么用?

想创建一个触发器,实现当有数据插入或更新后,执行这句sql语句:updatet_empsetxm=REGEXP_REPLACE(xm,'(){1,}','');作用为将其... 想创建一个触发器,实现当有数据插入或更新后,执行这句sql语句:update t_emp set xm = REGEXP_REPLACE(xm,'( ){1,}',''); 作用为将其中xm列去掉字符串中间空格,该怎么实现?我的代码:
create or replace trigger aiufer_emp_xm
after insert or update
of xm
on t_emp
for each row
begin
update t_emp set xm = REGEXP_REPLACE(xm,'( ){1,}','');
end;
问题1:不可以直接执行使用sql语句。
问题2:死循环。
求大神指点。
展开
 我来答
匿名用户
2012-12-14
展开全部
你这个是 Oracle 的 for each row 触发器
也就是 每行 触发一次的。

这种触发器, 不能直接通过 UPDATE 语句, 更新当前表。

应该是通过 :new 来更新当前行的数据。

也就是把
update t_emp set xm = REGEXP_REPLACE(xm,'( ){1,}','');

修改为:
:new.xm = REGEXP_REPLACE(xm,'( ){1,}','');
追问
:new.xm = REGEXP_REPLACE(xm,'( ){1,}','');这句报错了,必须声明标示符'xm',另外:statement  ignored     ‘xm’就是这个表的这一列,是不是不可以直接使用啊? 其实我不想使用行级触发器,但是不会其他的办法啊,最好是整个表有更新的时候执行实现去掉字符串中间空格。
求一个可以直接执行sql语句的触发器。
追答
不好意思, 没注意
应该是
:new.xm = REGEXP_REPLACE( :new.xm,'( ){1,}','');

如果不使用 逐行的 FOR EACH ROW 触发器。

那么你可以尝试使用 逐语句的 触发器。
也就是 一条 UPDATE 语句, 不管你更新了多少行, 这个触发器都只执行一次
(逐行的 FOR EACH ROW 触发器 是 更新了多少行, 执行多少次 )

使用语句级的触发器, 需要把 FOR EACH ROW 这行删除掉。
然后, 触发器里面, 就可以直接写 UPDATE 语句了。

不过这么写, 就会导致一个新问题, 那就是

会出现 ORA-00036: 超过递归 SQL 级别的最大值 50 的错误。

你需要在触发器里面,
先 SELECT, 检查, 有没有需要修改的数据。
如果有, 才 UPDATE.
micro0369
2012-12-14 · TA获得超过1.2万个赞
知道大有可为答主
回答量:9250
采纳率:85%
帮助的人:4021万
展开全部
思路,1.只管当前行,不要更新所有行。
2. 不要用update

create or replace trigger aiufer_emp_xm
after insert or update
of xm
on t_emp
for each row
begin
:new.xm = REGEXP_REPLACE(:new.xm,'( ){1,}','');
end;
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式