oracle触发器的问题:我写了一段代码,触发器创建成功了,但是测试时却显示触发器无效且未通过重新验证。

这段是建立std表的语句:createtablestd(deptnonumber(2),salnumber(5));insertintostdvalues(20,2000... 这段是建立std表的语句:create table std(deptno number(2),salnumber(5));
insert into std values(20,2000);
问题:假设std表中的信息,是部门号与该部门的平均工资。
现在要创建触发器,当在emp插入信息时,把工资低于所属部门的平均工资的职员信息插入到emp1表中。
附加:
(1)不需要考虑多行插入问题
(2)要更新std表的平均工资
我的代码:
create or replace trigger test
before insert on scott.emp
for each row
declare
--PRAGMA AUTONOMOUS_TRANSACTION;
tempsal number(5);
begin
select sal into tempsal from std where std.deptno=:new.deptno;
dbms_output.put_line('插入前std的值');
dbms_output.put_line(tempsal);
if :new.sal<tempsal then
insert into emp1 values
(:new.EMPNO,:new.ENAME,:new.JOB,:new.MGR,:new.HIREDATE,:new.SAL,:new.COMM,:new.DEPTNO);
end if;
--commit;
end test;

求大神指教!我纠结好久了!不好意思,只剩这些分了。
展开
 我来答
badkano
2013-05-27 · 知道合伙人体育行家
badkano
知道合伙人体育行家
采纳数:144776 获赞数:885371
团长

向TA提问 私信TA
展开全部

1

触发器中不需要commit,因为触发器里都是隐性提交的

 

2

把你的稍加改动,没做什么太大变化,你的没什么太多的为难题,只是那两个dbms_output.put_line也没什么用啊

 

代码给你贴出来吧

create or replace trigger test
before insert on scott.emp
for each row
declare
tempsal number(5);
begin  
select sal into tempsal from std where std.deptno=:new.deptno; 
dbms_output.put_line('插入前std的值');
dbms_output.put_line(tempsal);
if :new.sal<tempsal then 
insert into emp1 values(:new.EMPNO,:new.ENAME,:new.JOB,:new.MGR,:new.HIREDATE,:new.SAL,:new.COMM,:new.DEPTNO);
end if;
end test;

还有问题继续追问吧

追问
多谢啦~可是测试的时候还是显示触发器错误TAT
SQL> insert into scott.emp values(7783,'PING','CLERK',7839,to_date('9-27-2006','MM-DD-YYYY'),900,NUL
L,20);

第 1 行出现错误:
ORA-04098: 触发器 'SYS.WORK_TRIGGER' 无效且未通过重新验证
追答

我这没问题呀

我插入的是

insert into emp values (7779,'Wang','SALE',7902,TO_DATE('19800101','YYYYMMDD'),2000,NULL,20)

 

不行你就hi我吧,或者

推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式