CREATE OR REPLACE TRIGGER TEST_ADD 
  BEFORE INSERT ON TEST.TEST_TRIGGER 
  FOR EACH ROW 
declare
 tname varchar(21);
 i integer;
begin
  i:=0;
  tname:=:NEW.test_trigger.jh || :NEW.test_trigger.sjdwbh || i
  UPDATE SET test_trigger.sj_id='+' || &tname& || '+';
  i:=i+1;
end test_add;

解决方案 »

  1.   

    给你一个我的例子。差不错啦。CREATE OR REPLACE TRIGGER "RIGOR"."TI_PROJECTID" BEFORE
    INSERT ON "D_PROJECT" FOR EACH ROW DECLARE
        PROID VARCHAR(16);
        PROINT INTEGER; 
    BEGIN  PROID := SUBSTR(:NEW.PROJECTID,1,16);
      SELECT NVL(MAX(SUBSTR(PROJECTID,17,8)),0) + 1 INTO PROINT 
         FROM D_PROJECT  WHERE SUBSTR(PROJECTID,1,16) = PROID;
      :NEW.PROJECTID := PROID || LTRIM(TO_CHAR(PROINT,'0999'));
    END;
      

  2.   

    CREATE SEQUENCE i INCREMENT BY 1 START WITH 1 
        MAXVALUE 99 MINVALUE 1 CYCLE 
        NOCACHE NOORDER;CREATE OR REPLACE TRIGGER "TEST_ADD" 
    AFTER INSERT ON "TEST"."TEST_TRIGGER" 
    FOR EACH ROW 
    begin
      select :new.jh||:new.sjdwbh||lpad(i.nextval,2,'0') into :new.sj_id from dual;
    end test_add;
      

  3.   

    用DBA Studio建的话,不要忘记FOR EACH ROW啊,我就被这个折腾了半天~
      

  4.   

    zgh2003(世纪飞扬) 兄,我试了一下你给我写的,显示错误如下:Compilation errors for TRIGGER TEST.TEST_ADDError: PLS-00049: 错误的赋值变量 'NEW.TEST_TRIGGER'
    Line: 10
    Text: tname:=:NEW.test_trigger.jh || :NEW.test_trigger.sjdwbh || iError: PLS-00049: 错误的赋值变量 'NEW.TEST_TRIGGER'
    Line: 10
    Text: tname:=:NEW.test_trigger.jh || :NEW.test_trigger.sjdwbh || iError: PLS-00103: 出现符号 "UPDATE"在需要下列之一时:
           .(*@%&=-+;</>atinmodnot
              rem<an exponent (**)><> or != or ~=>=<=<>andorlikebetween
              is nullis not||is dangling
    Line: 11
    Text: UPDATE SET test_trigger.sj_id='+' || &tname& || '+';Error: Hint: Value assigned to 'tname' never used in ''
    Line: 11
    Text: UPDATE SET test_trigger.sj_id='+' || &tname& || '+';Error: Hint: Value assigned to 'i' never used in ''
    Line: 17
      

  5.   

    beckhambobo(beckham) 兄我试了一下你给我写,显示错误如下:首先弹出的错误框,显示:ORA-04084:无法更改此触发器类型的NEW值
    然后是下面的错误:(我用的是ORACLE8.1.6)Compilation errors for TRIGGER TEST.TEST_ADDError: PLS-00487: 对变量 'I' 的引用无效
    Line: 15Error: PL/SQL: SQL Statement ignored
    Line: 15Error: Hint: Variable 'tname' is declared but never used in ''
    Line: 7
      

  6.   

    1、先修改表属性
       alter table test_trigger 
       modify(sj_id varchar2(21),jh varchar2(16),sjdwbh varchar2(3));
    2、创建一个序列
       create sequence test_seq
       increment by 1
       start with 1
       maxvalue 9999
    3、创建触发器
       CREATE OR REPLACE TRIGGER TEST_ADD 
         BEFORE INSERT ON TEST_TRIGGER 
         FOR EACH ROW 
       declare
         tname varchar2(21);
         i number;
       begin
         select test_seq.nextval into i from dual;
         tname:=concat(:NEW.jh,:NEW.sjdwbh);
         tname:=concat(tname,to_char(i));
         :new.sj_id:=tname;
       end test_add;
      

  7.   

    zgh2003(世纪飞扬) 兄,表的结构我都修改成varchar2的类型了试了一下上面的程序,显示如下错误:
    ORA-04084:无法更改此触发器类型的NEW值
    Compilation errors for TRIGGER TEST.TEST_ADDError: PLS-00487: 对变量 'I' 的引用无效
    Line: 15Error: PL/SQL: SQL Statement ignored
    Line: 15
      

  8.   

    Error: PLS-00487: 对变量 'I' 的引用无效
    Line: 15-----------------------------------------------
    你创建序列了吗?
    我是测试成功了。
    另外你是操作哪一步导致上面的错误的?是修改表编译触发器?还是插入值出现的?
      

  9.   

    我创建序列了,我用PLSQL Developer这个工具创建和执行的
      

  10.   

    奇怪了,我现在ORACLE里面有重新建了一下是可以的,谢谢zgh2003(世纪飞扬) 兄!
      

  11.   

    其实beckhambobo(beckham) 兄写的就差不多,把AFTER修改为BEFORE问题就解决了,刚才zgh2003(世纪飞扬) 兄给我写的就是BEFORE的,我没有注意还是原来的AFTER,所以提示错误。再次感谢zgh2003(世纪飞扬)和beckhambobo(beckham)两位老兄,祝你们圣诞快乐!还有同样跟贴的老兄,圣诞快乐!散分!