我在表格中插入一些数据时尝试执行以下触发器:
CREATE OR REPLACE TRIGGER AJOUTER_NEW_CONSISTANCE
AFTER INSERT OR UPDATE OF
CONSISTANCE_LIBELLE_1,CONSISTANCE_LIBELLE_2,CONSISTANC_LIBELLE_3
ON DB.ETAT_PARCELLAIRE
BEGIN
insert into DB.CONSISTANCE.LIBELLE
select consistance_libelle_1
from DB.ETAT_PARCELLAIRE
where DB.ETAT_PARCELLAIRE.consistance_libelle_1 not in (
select LIBELLE from DB.CONSISTANCE.LIBELLE);
END;
但它一直给我以下错误:
PL/SQL : ORA00926 : Keyword Values absent.
我该如何解决这个问题? 提前感谢您的帮助:)
答案 0 :(得分:1)
如果CONSISTANCE
是一个名为LIBELLE
的列的表格,那么您就错误地引用了该列。
DB.CONSISTANCE.LIBELLE
应该是DB.CONSISTANCE(LIBELLE)
) 。正是这条线产生了ORA-00926。DB.CONSISTANCE.LIBELLE
应该只是DB.CONSISTANCE
)所以它应该是:
CREATE OR REPLACE TRIGGER AJOUTER_NEW_CONSISTANCE
AFTER INSERT OR UPDATE OF
CONSISTANCE_LIBELLE_1,CONSISTANCE_LIBELLE_2,CONSISTANC_LIBELLE_3
ON DB.ETAT_PARCELLAIRE
BEGIN
insert into DB.CONSISTANCE(LIBELLE)
select consistance_libelle_1
from DB.ETAT_PARCELLAIRE
where consistance_libelle_1 not in (
select LIBELLE from DB.CONSISTANCE);
END;
我也不确定CONSISTANC_LIBELLE_3
是否是拼写错误且应该是CONSISTANCE_LIBELLE_3
。
您还可以执行not exists
而不是not in
:
insert into DB.CONSISTANCE(LIBELLE)
select CONSISTANCE_LIBELLE_1
from DB.ETAT_PARCELLAIRE
where not exists (
select 1
from DB.CONSISTANCE
where LIBELLE = DB.ETAT_PARCELLAIRE.CONSISTANCE_LIBELLE_1
);
或使用merge
:
merge into DB.CONSISTANCE c
using (select CONSISTANCE_LIBELLE_1 from DB.ETAT_PARCELLAIRE) ep
on (c.LIBELLE = ep.CONSISTANCE_LIBELLE_1)
when not matched then
insert (LIBELLE) values (ep.CONSISTANCE_LIBELLE_1);
使用触发器(部分)维护该表看起来很奇怪 - 拥有一个从ETAT_PARCELLAIRE
中选择不同值的视图会更简单:
create or replace view CONSISTANCE_VIEW as
select distinct CONSISTANCE_LIBELLE_1
from ETAT_PARCELLAIRE;
但是它们会有不同的内容 - 一旦CONSISTANCE_LIBELLE_1
中出现一个值,它就会一直保留在CONSISTANCE
中,因为您没有删除已失效的值,只插入新值;而CONSISTANCE_VIEW
只显示当前表中的值。目前还不清楚你想要的行为。