2010-04-30 8 views
5

Ho un problema con il mio trigger. Inserendo una nuova linea controllerà se l'articolo non è stato venduto. Posso farlo nel software, ma penso che sia meglio quando il DB lo fa.La query non ha destinazione per i dati dei risultati dopo il 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); 

E questo è l'errore dopo l'inserimento.

[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 

Cosa c'è di sbagliato nel trigger? Senza di esso funziona alla grande.

risposta

8

Sostituire

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

con

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

come suggerito.

Ulteriori informazioni nel manuale ("38.5.2. Executing a Command With No Result").

+1

Grazie a voi :-) – ThreeFingerMark

Problemi correlati