oracle触发器before和after的问题。。求解答

createorreplacetriggertriafterinsertorupdateordeleteonempdeclarestrvarchar2(50);pragm... create or replace trigger tri
after insert or update or delete on emp
declare
str varchar2(50);
pragma autonomous_transaction;
begin
commit;
str:='drop table emp_c';
execute immediate str;
str:='create table emp_c as select * from emp';
execute immediate str;
dbms_output.put_line('sss');
end;
如上代码。为什么我执行添加删除的时候,输出了sss,但是没有执行触发器里面的sql语句。

然后将after换成before之后,我对emp表执行添加删除,为什么他创建的emp_c表总是比emp表慢一步。例如:往emp插入了4条数据,但emp_c中只有前面的那3条。
理论上不是同步么。。
展开
 我来答
沃德斯塔和皮皮塔
2012-04-26 · 超过31用户采纳过TA的回答
知道答主
回答量:64
采纳率:100%
帮助的人:30.3万
展开全部
1、触发器的作用,是每一条记录处理前后进行相应的处理,也就是说你每次处理一条emp的记录,都会执行一次drop和creare emp_c表。。。不要这样做啊,否则你插入1000条记录,就会重建1000次emp_c表
2、commit在触发器里面并不会提交当前事务,事实上insert emp和触发器是在同一个事物中的,相反,只有在这个事物最后,也就是说你的insert emp提交之后,emp_c才会真正提交。
追问
我写的是语句级触发器。。不是行级触发器所以不会有你说的1。。
至于你说的2,我将after换成before之后,我对emp表执行添加删除,为什么他创建的emp_c表总是比emp表慢一步。例如:往emp插入了4条数据,但emp_c中只有前面的那3条。
也就是说他还是提交了的。只是少了最后那次所做的修改或者添加。
追答
执行时候的相关语句能贴出来吗?
说实话不太喜欢用触发器,宁愿用SQL程序块
yuanbest911
2012-05-02 · 贡献了超过135个回答
知道答主
回答量:135
采纳率:0%
帮助的人:46.3万
展开全部
你这个明显错了吧。str:='create table emp_c as select * from emp';你再建这个 emp_c 表,但是这个表并没有删除啊,你这样会报错的吧。你应该直接插入
追问
不是这问题。。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式