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)

我尝试创建以下内容,但它给出了错误,因为在此未提及来宾表,但我不确定该放在哪里

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;

我得到的错误如下。下面是示例,但所有字段都来自 Guest 表(guestno、firstname、lastname、ADDRESS、CITY、STATE)

错误(9,38):PLS-00049:错误的绑定变量“OLD.FIRSTNAME”

4

2 回答 2

0

首先请解释触发器何时给出错误和错误的确切文本。正如我所看到的,触发器不正确: 1. IF UPDATEING - 拼写问题 + 如果触发器声明为 ON UPDATE,我不明白为什么要使用它 2. 如果您想检查是 :OLD.DATETO 是否已更改只需将其与 :new id 进行比较。3. IF 之后应该是 THEN

尝试添加这些修复并显示错误文本

BOOKING 表上的触发器可以处理 BOOKING 表中存在的字段。您正在尝试使用不可能的 GUEST 表的旧/新字段。只能在 GUEST 表上的触发器中访问新旧 GUEST。而已。

于 2012-09-17T19:29:27.743 回答
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;
于 2012-09-17T19:57:36.930 回答