问题在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无效
解决方案
从你所描述的:
尝试重新编译触发,看看会发生什么......
一个触发器变为无效如果基对象(ex..table)变为无效或改变,并且所述触发是指受影响的表。
其他提示
不知道为什么公认的答案已经被接受既不它也不是附加注释的似乎解决了明显的问题在张贴的代码。
在一个触发器主体我们用: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'
/
不隶属于 StackOverflow