2017-03-13 41 views
0

試圖創建一個觸發器,該觸發器查看地址表中的zip,將其與zipcode表中的zip匹配,並填充城市州和國家地址表。不過,我收到以下錯誤:創建觸發器錯誤錯誤:ORA-04076:無效的NEW或OLD規範

Error: ORA-04076: invalid NEW or OLD specification

我不確定如何在這裏使用新的或舊規範,有人可以幫忙嗎?

create or replace TRIGGER Addr_Zip 
BEFORE INSERT OR UPDATE OF Zip ON ADDRESS 
FOR EACH ROW 
when (address.zip = Zip_Code.zip) 
BEGIN 
update address set Address.city = (select City from Zip_Code), 
Address.State = (select State from Zip_Code), 
Address.Country = (select Country from Zip_Code) 
where address.zip = zip_code.zip; 
END; 
+0

https://docs.oracle.com/database/121/TDDDG/tdddg_triggers.htm#TDDDG52000 – OldProgrammer

回答

0

我們不使用發佈SQL語句,而是使用:NEW更新PL/SQL分配的當前記錄的值。命名空間。

create or replace TRIGGER Addr_Zip 
BEFORE INSERT OR UPDATE OF Zip ON ADDRESS 
FOR EACH ROW 
DECLARE 
    zip_rec zip_code%rowtype; 
BEGIN 
    select * into zip_rec 
    from zip_code 
    where :NEW.zip = Zip_Code.zip; 
    :NEW.city = zip_rec.City ; 
    :NEW.State = zip_rec.State; 
    :NEW.Country = zip_rec.Country; 
END; 

該版本從ZIP_CODE記錄中選擇一個局部變量以避免多重選擇。當然,這個觸發器應該是完全沒有必要的,因爲一個正確的規範化數據模型不會包含所有那些重複的列。但你可能不想知道這一點。

+0

謝謝。這是非常接近的,並讓我找出下面的缺失信息是允許觸發器成功觸發的代碼。創建或更換觸發器Addr_Zip 在插入地址之前插入或更新地址 FOR EACH ROW DECLARE zip_rec zip_code%rowtype; BEGIN select * from zip_code 其中:NEW.zip = Zip_Code.zip; :NEW.city:= zip_rec.City; :NEW.State:= zip_rec.State; :NEW.Country:= zip_rec.Country; END; –