2010-04-30 3 views
5

Ich habe ein Problem mit meinem Auslöser. Beim Einfügen einer neuen Zeile wird geprüft, ob der Artikel nicht verkauft wurde. Ich kann es in der Software machen, aber ich denke, es ist besser, wenn die DB dies tut.Abfrage hat kein Ziel für Ergebnisdaten nach Trigger

-- 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); 

Und das ist der Fehler nach dem Einfügen.

[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 

Was ist los mit dem Auslöser? Ohne es funktioniert super.

Antwort

8

ersetzen

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

mit

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

wie vorgeschlagen.

Weitere Informationen in der Anleitung ("38.5.2. Executing a Command With No Result").

+1

Danke, das funktioniert :-) – ThreeFingerMark

Verwandte Themen