错误代码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;发布于 2019-06-08 18:52:22
看来你不应该做任何事。一切正常,就您发布的代码而言(除了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>发布于 2019-06-08 21:13:58
问题很简单,您的触发器丢失了其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你应该表现得很好。
发布于 2019-06-09 08:10:26
对于
Oracle11g,不需要在SQL查询语句中使用currval和nextval伪usable,而需要在PL/SQL表达式中使用。
因此,避免使用:
select id_seq.nextval
into :new.id
from dual;直接使用
:new.id := id_seq.nextval;
而不是。
当然,在完全填充了在触发器末尾添加end子句这一主要问题之后,请执行上述操作。
https://stackoverflow.com/questions/56508919
复制相似问题