2010-04-30 8 views
5

Tengo un problema con mi desencadenador. Al insertar una nueva línea, comprobará si el artículo no se ha vendido. Puedo hacerlo en el software pero creo que es mejor cuando el DB lo hace.La consulta no tiene destino para los datos de resultado después del desencadenador

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

Y este es el error después de la inserción.

[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 

¿Qué hay de malo en el gatillo? Sin eso funciona genial

Respuesta

8

Reemplazar

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; 

como se sugiere.

Más información en el manual ("38.5.2. Executing a Command With No Result").

+1

Gracias esto funciona :-) – ThreeFingerMark

Cuestiones relacionadas