oracle中的触发器问题

Posted

技术标签:

【中文标题】oracle中的触发器问题【英文标题】:Problem with trigger in oracle 【发布时间】:2010-08-07 02:40:37 【问题描述】:

我是 oracle 新手,不知道这个触发器有什么问题:

CREATE OR REPLACE TRIGGER  "propuesta_casas" 
BEFORE INSERT ON "PROPUESTA_TIENDA_BARRIO"
FOR EACH ROW
 WHEN (new."CASASCAL" IS NULL) 
 BEGIN
    SELECT PROPUESTA.CASAS
    INTO :new."CASASCAL"
    FROM PROPUESTA WHERE PROPUESTA.IDPROPUESTA=new.IDPROPUESTA ;
 END;
/

错误:

PL/SQL: ORA-00904: "NEW"."IDPROPUESTA": 标识符无效

【问题讨论】:

有什么问题?您收到错误消息... @Leniel,当我运行 sql 时很好,但是当我在表中插入一行时,我得到一个错误:触发器 'MJVS.propuesta_casas' 无效......跨度> 当我编译时我得到:当 weit begin case 声明 end exception exit for goto if loop mod null pragma raise return select update 时发现 EOF 【参考方案1】:

不确定为什么接受的答案被接受,因为它和附加的 cmets 似乎都没有解决发布代码中的明显问题。

在触发器主体中,我们使用:NEW 代码字引用插入行中的值。发布的代码在引用 WHERE 子句中的列时缺少冒号。这是需要的:

CREATE OR REPLACE TRIGGER  "propuesta_casas" 
BEFORE INSERT ON "PROPUESTA_TIENDA_BARRIO"
FOR EACH ROW
 WHEN (new."CASASCAL" IS NULL) 
 BEGIN
    SELECT PROPUESTA.CASAS
    INTO :new."CASASCAL"
    FROM PROPUESTA 
    WHERE PROPUESTA.IDPROPUESTA=:new.IDPROPUESTA ;
 END;
/

顺便提一下,在创建对象时要注意在双引号中使用小写字母。

默认情况下,所有 Oracle 名称都以大写形式存储在数据字典中,但 SQL 语句不区分大小写。所以下面两条语句指的是同一个对象:

select * from emp
/
select * from EMP
/

但是,如果我们使用混合大小写或小写的名称创建对象并将其放在双引号中,则它会以确切的大小写存储在数据字典中。这意味着我们在引用对象时必须使用双引号中的确切大小写。因此,如果我们创建一个全小写的表...

create table "emp"  ...

...那么这个语句就会失败:

select * from emp
/

必须是

select * from "emp"
/

当然,如果我们已经有一个名为 EMP 的表,那么第一个语句就会成功,如果只是从不同的表中选择的话。

对于触发器,我们通常不会按名称来引用它们。但是每当我们在数据字典中查找触发器时,我们都必须使用大小写:

select status
from user_triggers
where trigger_name = 'propuesta_casas'
/

【讨论】:

【参考方案2】:

根据你的描述:

尝试重新编译触发器,看看会发生什么......

如果基础对象(例如..table)变得无效或被更改并且触发器引用受影响的表,则触发器将变得无效。

【讨论】:

当我编译时我得到:当 weit begin case 声明 end exception exit for goto if loop mod null pragma raise return select update 时发现 EOF 您收到了这个确切的信息?没有ORA-XXX错误码吗? 我错过了 END 语句,但现在这是新错误:PL/SQL: ORA-00904: "NEW"."IDPROPUESTA": identifider not valid 我认为你需要这样做:new."IDPROPUESTA"

以上是关于oracle中的触发器问题的主要内容,如果未能解决你的问题,请参考以下文章

oracle 中的更新触发器问题

oracle触发器查询中的问题

使用触发器删除 Oracle 表中的行

oracle 中的通用触发器

Oracle 中的删除分区触发器

我可以暂时禁用 oracle 存储过程中的触发器吗?