在我的表中插入一些数据时,我试图执行以下触发器:
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. 我怎么才能解决这个问题?
(谢谢你提前提供帮助:)
发布于 2014-03-20 09:36:37
如果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只会显示当前表中的值。你想要什么样的行为还不清楚。
https://stackoverflow.com/questions/22528197
复制相似问题