database 触发后查询没有结果数据的目的地
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/2743990/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Query has no destination for result data after trigger
提问by ThreeFingerMark
I have a problem with my trigger. On inserting a new line it will check if the article has not sold. I can do it in the software but I think its better when the DB this does.
我的触发器有问题。在插入新行时,它会检查文章是否尚未售出。我可以在软件中做到这一点,但我认为当数据库这样做时它会更好。
-- 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);
And this is the error after the insert.
这是插入后的错误。
[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
What is wrong with the trigger? Without it works great.
触发器有什么问题?没有它效果很好。
回答by Milen A. Radev
Replace
代替
SELECT offer_id FROM offer WHERE offer_id = NEW.offer_id AND date_sale IS NULL;
with
和
PERFORM offer_id FROM offer WHERE offer_id = NEW.offer_id AND date_sale IS NULL;
as suggested.
按照建议。
More info in the manual ("38.5.2. Executing a Command With No Result").
手册中的更多信息(“38.5.2. 执行没有结果的命令”)。