2016-05-30 57 views
2
CREATE TABLE HotelStays 
(roomNum INTEGER NOT NULL, 
arrDate DATE NOT NULL, 
depDate DATE NOT NULL, 
guestName CHAR(30) NOT NULL, 
PRIMARY KEY (roomNum, arrDate)) 
; 


CREATE OR REPLACE FUNCTION new_customer() RETURNS void AS 
$BODY$ 
DECLARE 
    depatureDate DATE;\ 
BEGIN 
    SELECT depDate INTO depatureDate FROM HotelStays WHERE OLD.roomNum = NEW.roomNum; 
    IF (depatureDate <= NEW,arrDate) 
     INSERT INTO HotelStays (roomNum, arrDate, depDate, guestName) 
    VALUES (:NEW.roomNum, :NEW.arrDate, :NEW.depDate, :NEW.guestName); 
    END IF; 
    RETURN; 
END 
$BODY$ 
LANGUAGE 'plpgsql' ; 
CREATE TRIGGER; 

INSERT INTO HotelStays(roomNum, arrDate, depDate, guestName) 
VALUES 
(123, to_date('20160202', 'YYYYMMDD'), to_date('20160206','YYYYMMDD'), 'A'); 

問題我試圖解決:一個新條目(新賓)可以放在一個房間號,甚至現有的前來做客已簽出。 我試圖解決使用觸發器這個問題。請幫助我。在此先感謝。

+1

是它在該行depatureDate DATE斜線; \ ? – Brett

+0

還是行LANGUAGE ...嘗試刪除LANGUAGE行 – Brett

回答

1

有在你的代碼的幾個誤區。首先,反斜線depatureDate DATE;\,你也失蹤了THENIF子句和new在其前面不需要:。在012中還有,而不是。最後的END缺少;

不是一個錯誤,但語言名稱是一個標識符,不要把它放在單引號中。

該行CREATE TRIGGER;也是錯誤的。如果你想創建觸發器,你的函數也需要聲明爲returns trigger返回新行,如果它是「之前」觸發器。如果你打算使用after觸發器,你仍然需要從中返回一些東西。

我不確定WHERE OLD.roomNum = NEW.roomNum;應該選擇什麼條件。如果您想獲取更改行的房間號碼,只需使用new.depdate即可。如果該查詢返回多於一行,則select .. into ...將失敗。你可能打算使用where roomnum = new.roomnum或類似的東西。

因此函數應該是這樣的:

CREATE OR REPLACE FUNCTION new_customer() 
    RETURNS trigger 
AS 
$BODY$ 
DECLARE 
    depatureDate DATE; 
BEGIN 
    SELECT depDate 
     INTO depatureDate 
    FROM HotelStays 
    WHERE roomNum = NEW.roomNum; 

    IF (depatureDate <= NEW.arrDate) THEN 
     INSERT INTO HotelStays (roomNum, arrDate, depDate, guestName) 
     VALUES (NEW.roomNum, nEW.arrDate, NEW.depDate, NEW.guestName); 
    END IF; 

    RETURN NEW; -- this is important for a trigger 
END; 
$BODY$ 
LANGUAGE plpgsql;

和代碼來創建觸發器將是這樣的:

CREATE TRIGGER check_stays 
    before update or insert on hotelstays 
    execute procedure new_customer(); 
+0

我收到以下錯誤: 錯誤:在「$ BODY $ DECLARE depatureDate DATE」處或附近未終止的美元報價字符串。你能否幫我解決 –

+0

@SunilkumarVuppala:適合我。你正在使用哪個SQL客戶端?也許這不理解美元報價。如果對函數體使用「常規」單引號會發生什麼?什麼是你的**精確** Postgres版本? ('select version()'的輸出) –

+0

我正在使用sql提琴... PostgreSQL 9.3 –