2012-09-17 35 views
0

我們可以在一個觸發器中使用兩個表嗎?我有歷史表,因爲我需要從兩個表中放置數據。一個觸發器從兩個表中讀取

IE。

Guest (Guestno, firstname,lastname,address,city, state, zip.....) 
Booking (BookingId, Hotelno, Guestno, datefrom, datefrom) 
Boogking history (bookingid,guestno, fristname,lastname, address, city, state, zip, hotelno, datefrom, dateto) 

因此觸發我要創建的是,每當在預訂表datefrom更新應該更新booking_history表中的所有信息(除dateto ....萬一要是dateto沒有輸入)

我嘗試創建下面,但因爲客桌不在此menetioned提示錯誤,但我不知道在哪裏把

CREATE OR REPLACE TRIGGER BOOKING_DATETO_UPDATE 
AFTER UPDATE OF DATETO ON BOOKING 
FOR EACH ROW 
BEGIN 


INSERT INTO BOOKINGHISTORY 
(BOOKINGID, GUETNO, FIRSTNAME, LASTNAME, ADDRESS, CITY, STATE, ZIP, HOTELNO, DATETO, DATFROM) 

VALUES (:OLD.bookingid,:OLD.guestno, :OLD.FirstName, :OLD.LastName, 
:OLD.Address, :OLD.City, :OLD.State, :OLD.Zip, :OLD,Hotelno, :OLD.Dateto, :OLD.Datefrom); 


end; 

錯誤我得到下面是。下面是樣品,但一切都從客戶表(guestno,名字,姓氏,地址,城市,州)

錯誤(9,38)中的字段:PLS-00049:壞綁定變量 'OLD.FIRSTNAME'

+0

請向我們展示真實(確切)的錯誤消息。 –

回答

0

首先請解釋何時觸發器會給出錯誤和確切的錯誤文本。正如我所看到的不是觸發器不正確: 1.如果更新 - 拼寫問題+我不明白你爲什麼使用它,如果觸發器聲明爲ON更新 2.如果你想檢查是:OLD.DATETO是否改變只是比較它:新的ID。 3.如果以後要THEN

嘗試添加這些修補程序,並顯示錯誤文本上的預訂表

觸發器可以應對存在於表預訂領域。您正嘗試使用GUEST表的舊/新字段,這是不可能的。只有在GUEST表的觸發器中才能訪問舊的和新的GUEST。而已。

+0

1.)我刪除了部分它說如果更新.....我明白你說什麼 2)我仍然得到該編譯錯誤。下面是示例....但來自guest表的所有字段都有相同的問題。 錯誤(9,38):PLS-00049:壞綁定變量'OLD.FIRSTNAME' – user1672735

+0

我更新我的答案。看見。簡而言之 - 不可能做到你想要達到的目標。 –

0

你的觸發器當然可以查詢一個表格,而不是它定義的表格(儘管把這種邏輯放入觸發器使得你很可能會回來並詢問如何解決變異表格將來的例外情況)。

CREATE OR REPLACE TRIGGER BOOKING_DATETO_UPDATE 
    AFTER UPDATE OF DATETO ON BOOKING 
    FOR EACH ROW 
DECLARE 
    l_guest_rec guest%rowtype; 
BEGIN 
    -- If `guestno` can change, you'll need to tell us whether you want to use the old or the 
    -- new `guestno` to look up the appropriate row in the `guest` table. 
    SELECT * 
    INTO l_guest_rec 
    FROM guest 
    WHERE guestno = :old.guestno; 

    INSERT INTO BOOKINGHISTORY(BOOKINGID, 
           GUESTNO, 
           FIRSTNAME, 
           LASTNAME, 
           ADDRESS, 
           CITY, 
           STATE, 
           ZIP, 
           HOTELNO, 
           DATETO, 
           DATFROM) 
    VALUES (:OLD.bookingid, 
      :OLD.guestno, 
      l_guest_rec.FirstName, 
      l_guest_rec.LastName, 
      l_guest_rec.Address, 
      l_guest_rec.City, 
      l_guest_rec.State, 
      l_guest_rec.Zip, 
      :OLD,Hotelno, 
      :OLD.Dateto, 
      :OLD.Datefrom); 
end;