2010-04-30 55 views
5

我的觸發器出現問題。在插入新行時,它將檢查文章是否未售出。我可以在軟件中做到這一點,但我認爲當數據庫這樣做時它會更好。查詢觸發後沒有結果數據的目的地

-- Create function 
CREATE OR REPLACE FUNCTION checkSold() RETURNS TRIGGER AS $checkSold$ 
    BEGIN 
     SELECT offer_id FROM offer WHERE offer_id = NEW.offer_id AND date_sale IS NULL; 

    IF NOT FOUND THEN 
     RAISE EXCEPTION 'The Offer is Sold!'; 
    END IF; 
    RETURN NEW; 
END; 
$checkSold$ LANGUAGE plpgsql; 


-- Create trigger 
Drop TRIGGER checkSold ON tag_map; 
CREATE TRIGGER checkSold BEFORE INSERT ON tag_map FOR EACH ROW EXECUTE PROCEDURE checkSold(); 

INSERT INTO tag_map (tag_id,offer_id) VALUES (824,80); 

而這是插入後的錯誤。

[WARNING ] INSERT INTO tag_map (tag_id,offer_id) VALUES (824,80) 
      ERROR: query has no destination for result data 
      HINT: If you want to discard the results of a SELECT, use PERFORM instead. 
      CONTEXT: PL/pgSQL function "checksold" line 2 at SQL statement 

觸發器有什麼問題?沒有它很好。

回答

8

更換

SELECT offer_id FROM offer WHERE offer_id = NEW.offer_id AND date_sale IS NULL; 

PERFORM offer_id FROM offer WHERE offer_id = NEW.offer_id AND date_sale IS NULL; 

的建議。

更多信息在手冊("38.5.2. Executing a Command With No Result")。

+1

謝謝你的作品:-) – ThreeFingerMark 2010-04-30 11:50:35