oracle中的触发器问题

时间:2010-08-07 02:40:37

标签: sql oracle plsql oracle10g ora-00904

我是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”:识别者无效

2 个答案:

答案 0 :(得分:3)

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

在触发器主体中,我们使用: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'
/

答案 1 :(得分:2)

根据你的描述:

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

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