2013-10-31 478 views
0

我有以下觸發:Oracle觸發器更新行

create or replace 
trigger updateBeds 
    After insert or update on INPATIENT_STAY for 
    each row 
Begin 
if(:new.INPATIENT_STAY.DATEPLACEDINWARD<=sysdate and :new.INPATIENT_STAY.expectedleavedate>=sysdate) 
then 
    update WARD 
    set BEDSAVAIL = TOTALBEDS - 1 
    where WARDNUM = :new.INPATIENT_STAY.WARDNUM; 
end if; 
if(:new.INPATIENT_STAY.DATELEFT <= sysdate) then 
    update WARD 
    set BEDSAVAIL = TOTALBEDS +1 
    where WARDNUM = :new.INPATIENT_STAY.WARDNUM; 
end if; 
END; 

這觸發意味着從列totalbeds減1,如果INPATIENT_STAY.DATEPLACEDINWARDINPATIENT_STAY.expectedleavedate小於系統日期。 此外,如果INPATIENT_STAY.DATELEFT小於或等於系統日期,totalbeds應1. WARD增加由INPATIENT_STAY外鍵名爲鏈接到INPATIENT_STAYWARDNUM

當我嘗試編譯扳機,我得到以下錯誤:

Error(2,4): PLS-00049: bad bind variable 'NEW.INPATIENT_STAY' 
Error(2,54): PLS-00049: bad bind variable 'NEW.INPATIENT_STAY' 
Error(6,21): PLS-00049: bad bind variable 'NEW.INPATIENT_STAY' 
Error(8,4): PLS-00049: bad bind variable 'NEW.INPATIENT_STAY' 
Error(11,21): PLS-00049: bad bind variable 'NEW.INPATIENT_STAY' 

我不知道我在做什麼錯在這裏。任何幫助深表感謝

的表是:

WARD 
    WARDNUM VARCHAR2(20 BYTE) 
    NAME VARCHAR2(40 BYTE) 
    TOTALBEDS NUMBER 
    BEDSAVAIL NUMBER 

INPATIENT_STAY 
    INPATIENTID VARCHAR2(20 BYTE) 
    WARDNUM VARCHAR2(20 BYTE) 
    EXPECTEDLEAVEDATE DATE 
    DATEPLACEDINWARD DATE 
    DATELEFT DATE 

回答

1

要插入/更新的行訪問列的值,只需使用:new.column_name - 你不應該在:new和列名之間添加的表名,試試這個:

create or replace 
trigger updateBeds 
    After insert or update on INPATIENT_STAY for 
    each row 
Begin 
if(:new.DATEPLACEDINWARD<=sysdate and :new.expectedleavedate>=sysdate) 
then 
    update WARD 
    set BEDSAVAIL = TOTALBEDS - 1 
    where WARDNUM = :new.WARDNUM; 
end if; 
if(:new.DATELEFT <= sysdate) then 
    update WARD 
    set BEDSAVAIL = TOTALBEDS +1 
    where WARDNUM = :new.WARDNUM; 
end if; 
END; 
+0

我仍然得到同樣的錯誤,但這個時候'new.WARDNUM' – Pindo

+0

@Pindo請更新您的問題,我們展示了這兩個'INPATIENT_STAY'和'WARD'表的表定義。 –

+0

我已更新問題 – Pindo