本帖最后由 auditionlsl 于 2009-06-18 14:26:21 编辑

解决方案 »

  1.   

    首先明白触发器中 new 和old ,其余的就比较简单了。把当前的序列值格式化成 0000001,0000002 的样式,长度为7将格式化好的序列值连接串'Usr'赋予userid 字段即将插入的值,形成 Usr0000001,Usr0009999 
      

  2.   

    楼上已经解说,只要明白NEW的定义就OK了,你的触发器是INSERT行级触发,因此你所需要触发的表肯定是新增的.
     :new userid := 'Usr' || lpad(tempnum,7,'0'); 
    这样你就可以明白NEW的一些涵义了,当然这只是一部分理解,更深的需要你自己看看NEW与OLD的定义规则了!
      

  3.   

    网上搜的代码都不能建立Trigger,好多站点上都是复制粘贴别人写的东西,压根就不行.我都不知道怎样才能在Oracle中建立一个Trigger了,我是个Oracle新手,各位帮忙写个可以创建Tirgger的代码给我,我可以再加分.谢谢!
      

  4.   

    1、确保序列TAB_SEQUENCE存在
    2、确保表USERS存在,且含有USERID子段
    创建trigger的语句如下:CREATE OR REPLACE TRIGGER USERS_BIR
      BEFORE INSERT ON USERS
      FOR EACH ROW
    DECLARE
      TEMPNUM NUMBER;
    BEGIN
      SELECT TAB_SEQUENCE.NEXTVAL    INTO TEMPNUM
        FROM DUAL;
        :NEW.USERID := 'Usr' || LPAD(TEMPNUM,
                                   7,
                                   '0');
    END USERS_BIR;
      

  5.   

    :new userid 要写成  :new.userid 
      

  6.   


    up像这个需求不用trigger也可以直接做的哟insert into users values('user'||tab_sequence.nextval, .......);
      

  7.   

    再帮忙看下,结果如下:SQL> CREATE OR REPLACE TRIGGER USERS_TG
      2    BEFORE INSERT ON TESTTB
      3    FOR EACH ROW
      4  DECLARE
      5    TEMPNUM NUMBER;
      6  BEGIN
      7    SELECT T1_SEQUENCE.NEXTVAL
      8      INTO TEMPNUM
      9      FROM DUAL;
     10      :NEW.ID := 'Usr' || LPAD(TEMPNUM,
     11                                 7,
     12                                 '0');
     13  END USERS_TG;
     14  .
    SQL> COMMIT;提交完成。SQL> SELECT TRIGGER_NAME FROM USER_TRIGGERS;未选定行SQL> INSERT INTO TESTTB(USERNAME) VALUES('TEST1');
    INSERT INTO TESTTB(USERNAME) VALUES('TEST1')
    *
    ERROR 位于第 1 行:
    ORA-01400: 无法将 NULL 插入 ("XWW"."TESTTB"."ID")
    SQL>
      

  8.   

    在建立完Trigger后,使用:
    SQL> SELECT TRIGGER_NAME FROM USER_TRIGGERS;
    查询当前用户的Trigger表中,就没有Trigger,不知道是咋回事?
      

  9.   

    这里id已经设置成primary key了吧。或者是not null的
      

  10.   

    是的.不过我将id字段的primary key支掉了也还是不行.将not null高为可以为空的话,数据就进去了,不过id的空值.
      

  11.   


    你都没指明触发器的名称,怎么查?
    你上面编写的触发器名是USERS_TG你的查询语句至少是这样的:
    select USERS_TG from USER_TRIGGERS;
      

  12.   

    虽然俺是新手,不过这个查询还是没有错的.
    这是用来查询前用户的触发器表中所有的TRIGGER_NAME字段的数据的.