database - 查询在触发后没有结果数据的目的地

标签 database postgresql triggers plpgsql

我的触发器有问题。在插入新行时,它将检查商品是否未售出。我可以在软件中做到这一点,但我认为当数据库这样做时更好。

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

触发器有什么问题?没有它效果很好。

最佳答案

替换

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" )。

关于database - 查询在触发后没有结果数据的目的地,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2743990/

相关文章:

mysql - 将数组数据输入数据库表时遇到困难

mysql - 在mysql数据库中存储时区信息

mysql - 优化的 mysql 表模式,用于读写数据

sql - MongoDB:如何检索新构造的数据而不是集合中的原始文档?

database - SQL在表中保存相同产品的不同版本

javascript - 在连接期间设置 application_name

sql - 使用 select 返回多个 id 同时更新多行

sql - 如何使用更新触发器更新另一个表?

sql - 如何使用 Microsoft SQL Server Management Studio 为数据库中的所有触发器生成脚本

MySQL插入后触发