创建一个表aaa,自增字段为id,为其创建一个序列aaa_i,然后是一个触发器,请问哪里有问题,表和序列都没问题,触发器执行的时候说是
警告:创建的触发器带有编译错误
再insert数据的时候报错:
ORA-04098: trigger 'SYSTEM.AAA_ID' is invalid and failed re-validation大家帮忙看看哪一步出问题了?谢谢了。create table aaa
(
    id int not null,
    name varchar2(50),
    primary key (id)
);create sequence aaa_i increment by 1 start with 1;create or replace trigger aaa_id
before insert on aaa 
for each row
begin
    if :new.id is NULL or :new.id=0 then
   select aaa_i.nextval into :new.id from dual;
    end if;
end aaa_id;
/insert into aaa values(NULL, 'liming');

解决方案 »

  1.   


    --try it
    --触发器
    create or replace trigger aaa_id
    before insert on aaa 
    for each row
    begin
        select aaa_i.nextval into :new.id from dual;end;
    --插入
    insert into aaa(name) values('liming');
      

  2.   

    --插入
    insert into aaa(name) values('liming');--对的,应该是这样子来操作
      

  3.   

    用触发器好象是多余的吧?create table aaa
    (
        id int not null,
        name varchar2(50),
        primary key (id)
    );create sequence aaa_i 
    minvalue 1 
    maxvalue 99999999999 
    start with 1 
    increment by 1 ;insert into aaa values(aaa_i.nextval, 'liming');
      

  4.   


    就是为了可以不写那一列,或者直接写个空就行了,而不用非要写一个nextval才用的触发器不过还是感谢。。
      

  5.   


    同感,lz既然建了sequence直接用insert into aaa values(aaa_i.nextval, 'liming'); 就ok了
    ,没必要再写个触发器啊
      

  6.   

    晕,insert into aaa values(aaa_i.nextval, 'liming'); 这样写很麻烦吗??写个触发器更麻烦啊,而且sequece的用法也是这样用的啊,不需要触发器来帮助使用sequence啊
      

  7.   

    关键现在是从mysql移植到oracle,有些东西用触发器就不用改代码了。。
      

  8.   

    是你的建trigger语句select aaa_i.nextval into :new.id from dual;
    前面有一些特殊字符,把它们删除就行了
      

  9.   

    create table aaa
    (
        id int not null,
        name varchar2(50),
        primary key (id)
    );create sequence aaa_i increment by 1 start with 1;create or replace trigger aaa_id
    before insert on aaa
    for each rowbegin
      select aaa_i.nextval into :new.id from dual;
    end;
    insert into aaa(name) values('liming');
      

  10.   

    明白了,应该是select 语句前面有Tab或者其它看不到的字符吧,去掉就好了,问题已经解决结帖。。