sqlplus中直接执行create TRIGGER就可以了,你编译通过没有?看样子好像这个触发器还没有编译通过阿

解决方案 »

  1.   

    单击编译按钮时,没有反应,左下角显示invalid,该怎么办?
      

  2.   

    ---SELECT USERNO INTO :NEW.USRENO----
    你这种写法,是对触发器根本就没有理解
    从函数角度来讲,:NEW.USERNO只是一个传入参数
      

  3.   

    zhsh(人间真发) 说的很有道理.仔细看看你写的这个触发器,问题就解决了.
      

  4.   

    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;编译通过后即生效,用不着提交。
      

  5.   

    把after insert改成before insert
      

  6.   

    感谢各位的帮助,问题现在终于解决了。下面是正确的写法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语句块最后要用一个“/”结尾,可能其他的如存储过程等也是这样吧,我以前没有用到过这些东西,所以一直不知道。由此,我觉得正是这些细节的地方,大家都不在意,不会的人呢就总也过不去。这就需要大家踏踏实实地对待每一个问题,千万不要浮躁。
      最后,感谢大家的帮助。分不多,大家都有份,请多多谅解。