2010-08-07 86 views
1

我在甲骨文新的,我不知道什么是错这个触发器:问题的触发器在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": identifider not valid

+2

问题是什么?有错误消息你越来越... – 2010-08-07 02:43:27

+0

@Leniel,当我运行SQL是好的,但是当我在表中插入一行,我得到一个错误:触发'MJVS.propuesta_casas'是无效的.. 。 – diegueus9 2010-08-07 02:48:11

+0

当我编译我得到:被发现EOF当weit开始时case声明结束异常退出goto如果循环mod null编译提升返回选择更新 – diegueus9 2010-08-07 02:55:12

回答

2

从你所描述的:

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

如果基础对象(ex..table)becom es无效或更改,触发器引用受影响的表。

+0

当我编译我得到:被发现EOF当weit开始时case声明结束异常退出goto如果循环mod null的附注提高返回选择更新 – diegueus9 2010-08-07 02:56:24

+0

你会得到这个确切的消息?没有ORA-XXX错误代码? – 2010-08-07 02:58:37

+0

我错过了sta完,但现在这是新的错误: PL/SQL:ORA-00904:“NEW”。“IDPROPUESTA”:identifider无效 – diegueus9 2010-08-07 03:01:15

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语句不区分大小写。所以,下面的两个statments指向同一个对象:

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' 
/