---SELECT USERNO INTO :NEW.USRENO---- 你这种写法,是对触发器根本就没有理解 从函数角度来讲,:NEW.USERNO只是一个传入参数
zhsh(人间真发) 说的很有道理.仔细看看你写的这个触发器,问题就解决了.
CREATE OR REPLACE TRIGGER TEST AFTER INSERT ON COMMITFEE FOR EACH ROW declare v_userno number(10); BEGIN SELECT USERNO INTO v_userno FROM USERINFO WHERE USERNAME = :NEW.USERNAME; :new.userno=v_userno; END; / show error;编译通过后即生效,用不着提交。
把after insert改成before insert
感谢各位的帮助,问题现在终于解决了。下面是正确的写法CREATE OR REPLACE TRIGGER SYSTEM.TEST BEFORE INSERT ON SYSTEM.COMMITFEE FOR EACH ROW BEGIN IF :NEW.USERNAME IS NOT NULL THEN SELECT USERNO INTO :NEW.USERNO FROM SYSTEM.USERINFO WHERE USERNAME = :NEW.USERNAME; ELSE IF :NEW.USERNO IS NOT NULL THEN SELECT USERNAME INTO :NEW.USERNAME FROM SYSTEM.USERINFO WHERE USERNO = :NEW.USERNO; END IF; END IF; END; 我最初犯的错误是选错了触发时机,因该是 BEFORE INSERT 而不是 AFTER INSERT,这一点bobfang(匆匆过客)说得很在理。另外就是没有考虑全面,也就是没有加条件判断,这样如果插入记录时没有对USERNAME赋值时就会出如下错误:找不到对应值。经过修改后的触发器可以有针对性地取出缺少的值(用户名或者用户编号) 。 zhsh(人间真发)及lihan007的说法未免有些武断,我上面的经过修改后的触发器工作正常,:NEW.USERNAME作为输入参数,是可以接受SQL语句的执行结果的。 还有一个问题,我开始时不知道怎样在SQL PLUS中提交触发器,大家的发言中也没有具体的说法,因为我以前以为就是把触发器的SQL语句写上,用分号结束即可。可是在SQL PLUS中却没有结束,后来看了 BlueskyWide(谈趣者)的贴子,才知道触发器的SQL语句块最后要用一个“/”结尾,可能其他的如存储过程等也是这样吧,我以前没有用到过这些东西,所以一直不知道。由此,我觉得正是这些细节的地方,大家都不在意,不会的人呢就总也过不去。这就需要大家踏踏实实地对待每一个问题,千万不要浮躁。 最后,感谢大家的帮助。分不多,大家都有份,请多多谅解。
你这种写法,是对触发器根本就没有理解
从函数角度来讲,:NEW.USERNO只是一个传入参数
declare
v_userno number(10);
BEGIN
SELECT USERNO INTO v_userno FROM USERINFO WHERE USERNAME = :NEW.USERNAME;
:new.userno=v_userno;
END;
/
show error;编译通过后即生效,用不着提交。
BEFORE INSERT ON SYSTEM.COMMITFEE FOR EACH ROW
BEGIN
IF :NEW.USERNAME IS NOT NULL THEN
SELECT USERNO INTO :NEW.USERNO
FROM SYSTEM.USERINFO
WHERE USERNAME = :NEW.USERNAME;
ELSE IF :NEW.USERNO IS NOT NULL THEN
SELECT USERNAME INTO :NEW.USERNAME
FROM SYSTEM.USERINFO
WHERE USERNO = :NEW.USERNO;
END IF;
END IF;
END;
我最初犯的错误是选错了触发时机,因该是 BEFORE INSERT 而不是 AFTER INSERT,这一点bobfang(匆匆过客)说得很在理。另外就是没有考虑全面,也就是没有加条件判断,这样如果插入记录时没有对USERNAME赋值时就会出如下错误:找不到对应值。经过修改后的触发器可以有针对性地取出缺少的值(用户名或者用户编号) 。
zhsh(人间真发)及lihan007的说法未免有些武断,我上面的经过修改后的触发器工作正常,:NEW.USERNAME作为输入参数,是可以接受SQL语句的执行结果的。
还有一个问题,我开始时不知道怎样在SQL PLUS中提交触发器,大家的发言中也没有具体的说法,因为我以前以为就是把触发器的SQL语句写上,用分号结束即可。可是在SQL PLUS中却没有结束,后来看了 BlueskyWide(谈趣者)的贴子,才知道触发器的SQL语句块最后要用一个“/”结尾,可能其他的如存储过程等也是这样吧,我以前没有用到过这些东西,所以一直不知道。由此,我觉得正是这些细节的地方,大家都不在意,不会的人呢就总也过不去。这就需要大家踏踏实实地对待每一个问题,千万不要浮躁。
最后,感谢大家的帮助。分不多,大家都有份,请多多谅解。