ORACLE11g自动增量

时间:2019-06-08 18:02:15

标签: oracle oracle11g database-trigger

  

错误代码4098,SQL状态42000:ORA-04098:触发器'HR.TRGM_ID'无效,并且重新验证失败

我遇到了这个问题。我该怎么办?

create table kids(
       id integer primary key, 
       mbrand varchar(100) , 
       mmodel varchar(100), 
       mprice integer,
       mquantity integer,
       mdescription varchar(100),
       mphoto varchar(100)
);

CREATE SEQUENCE  id_seq;

create trigger trgk_id
      before insert on kids
      for each row
    begin
      select id_seq.nextval
        into :new.id
        from dual;

5 个答案:

答案 0 :(得分:2)

似乎您不应该做任何事情。就您发布的代码而言,一切正常(除了END丢失的事实)。

另一方面,Oracle抱怨触发器的名称为TRGM_ID,而我们拥有其代码的触发器名为TRGK_ID。我们在谈论同一触发因素吗?

SQL> create table kids(
  2         id integer primary key,
  3         mbrand varchar(100) ,
  4         mmodel varchar(100),
  5         mprice integer,
  6         mquantity integer,
  7         mdescription varchar(100),
  8         mphoto varchar(100)
  9  );

Table created.

SQL> CREATE SEQUENCE  id_seq;

Sequence created.

SQL> create trigger trgk_id
  2    before insert on kids
  3    for each row
  4  begin
  5    select id_seq.nextval
  6      into :new.id
  7      from dual;
  8  end;
  9  /

Trigger created.

SQL> insert into kids (mbrand) values ('Nike');

1 row created.

SQL> select id, mbrand from kids;

        ID MBRAND
---------- ----------
         1 Nike

SQL>

答案 1 :(得分:2)

问题很简单,您的触发器缺少END语句。将触发器改写为

create OR REPLACE trigger trgk_id
      before insert on kids
      for each row
    begin
      select id_seq.nextval
        into :new.id
        from dual;
END TRGK_ID;  -- added

你应该很好。

dbfiddle here

答案 2 :(得分:1)

  

对于Oracle11g,无需使用currvalnextval伪列   在SQL查询语句中,而在PL / SQL中可用   表达。

因此,请避免使用:

  select id_seq.nextval
    into :new.id
    from dual;

并直接使用

:new.id := id_seq.nextval;

相反。

P.S。当然,请在完成在触发器的末尾添加end子句的主要问题后执行上述操作。

答案 3 :(得分:0)

错误说“ TRGM_ID”(带有“ m”):

Error code 4098, SQL state 42000: ORA-04098: trigger 'HR.TRGM_ID' is invalid and failed re-validation

您的代码说“ TRGK_ID”(带有“ k”):

create trigger trgk_id

检查“ TRGM_ID”代码,或尝试重新编译触发器:

alter trigger [nameOfTrigger] compile;

答案 4 :(得分:0)

如果使用的是Oracle 12c或更高版本,则可以使用标识列,而不是手动创建序列和触发器。更清洁:

create table kids(
       id integer generated always as identity primary key,
       mbrand varchar(100) , 
       mmodel varchar(100), 
       mprice integer,
       mquantity integer,
       mdescription varchar(100),
       mphoto varchar(100)
);

https://oracle-base.com/articles/12c/identity-columns-in-oracle-12cr1