2010-08-07 35 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' 
/