首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >缺少Oracle 9i的关键字“Values”

缺少Oracle 9i的关键字“Values”
EN

Stack Overflow用户
提问于 2014-03-20 09:11:18
回答 1查看 62关注 0票数 0

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

代码语言:javascript
复制
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;  

但它总是给我带来以下错误:

代码语言:javascript
复制
PL/SQL : ORA00926 : Keyword Values absent.  

我怎么才能解决这个问题?

(谢谢你提前提供帮助:)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-03-20 09:36:37

如果CONSISTANCE是一个包含名为LIBELLE的列的表,那么引用它是错误的。

  • 您的insert包含该列,我假设该列意味着表中有其他列,您只想将一个值插入到该列中,但是语法错误(DB.CONSISTANCE.LIBELLE应该是DB.CONSISTANCE(LIBELLE))。是这条线产生了ORA-00926。
  • 您的子选择包括表名中的列(DB.CONSISTANCE.LIBELLE应该是DB.CONSISTANCE)。

所以应该是:

代码语言:javascript
复制
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

代码语言:javascript
复制
  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

代码语言:javascript
复制
  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中选择不同值的视图会更简单

代码语言:javascript
复制
create or replace view CONSISTANCE_VIEW as
select distinct CONSISTANCE_LIBELLE_1
  from ETAT_PARCELLAIRE;

但是它们有不同的内容--一旦在CONSISTANCE_LIBELLE_1中出现了一个值,它将始终保留在CONSISTANCE中,因为您不会删除已失效的值,只会插入新的值;而CONSISTANCE_VIEW只会显示当前表中的值。你想要什么样的行为还不清楚。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22528197

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档