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:“新”。“IDPROPUESTA”:标识符无效

4

2 回答 2

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'
/
于 2010-08-07T06:36:05.147 回答
2

根据您的描述:

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

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

于 2010-08-07T02:52:45.227 回答