没有Oracle 9i的关键字'值'

时间:2014-03-20 09:11:18

标签: sql oracle oracle9i

我在表格中插入一些数据时尝试执行以下触发器:

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.  

我该如何解决这个问题? 提前感谢您的帮助:)

1 个答案:

答案 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只显示当前表中的值。目前还不清楚你想要的行为。