2016-05-30 14 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日にスラッシュ; \ ? – Brett

+0

またはLANGUAGE ... LANGUAGE行を削除しようとしました – Brett

答えて

1

あなたのコード内のいくつかのエラーがあります。depatureDate DATE;\の最初のバックスラッシュ。またためTHENが欠落していますIF句とnewの前に:は必要ありません。012に.の代わりに。そして最後のENDには;がありません。

エラーではありませんが、言語名は識別子です。一重引用符で囲みません。

CREATE TRIGGER;も間違っています。トリガを作成したい場合は、 "before"トリガであれば、新しい行を返すために、returns triggerと宣言されている必要があります。アフタートリガーを使用する予定がある場合は、それでも何かを返す必要があります。

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 fiddleを使っています... PostgreSQL 9.3 –