【问题标题】:Triggers in postgrespostgres 中的触发器
【发布时间】:2011-12-19 05:04:59
【问题描述】:

我在 PL/pgSQL 中为 PostgreSQL 编写了一个简单的触发器,但它没有按我的计划工作。我有两个问题:

  1. 是否有 PostgreSQL 函数的调试器?
  2. 我哪里错了?我需要在这里查看idprod

CREATE OR REPLACE FUNCTION add_towh() RETURNS TRIGGER AS $$
DECLARE
    idsupp integer;
    idprod integer;
    whamount integer;
BEGIN

    SELECT PRODUCT INTO idsupp from SUPPLIERS where ID = NEW.SUPPLIER;
    SELECT ID INTO idprod from PRODUCTS where ID = idsupp;

    if (idprod > 0) then
        select amount into whamount from warehouses where product = idprod;
        update warehouses set amount = whamount * new.amount;
    else
        insert into warehouses (product,amount) values(idprod, new.amount);     
    end if;
    RETURN NEW; 
END;

$$ LANGUAGE plpgsql;

CREATE TRIGGER addtowh
AFTER INSERT ON orders FOR EACH ROW EXECUTE PROCEDURE add_towh ();

【问题讨论】:

    标签: sql postgresql triggers plpgsql


    【解决方案1】:

    您的if (idprod > 0) 可能最好写成if idprod is not null,但idprod > 0 应该可以工作。

    我猜错误就在这里:

    update warehouses set amount = whamount * new.amount;
    

    您在该 UPDATE 上没有 WHERE 子句,因此您将更改表中的每一行。你可以改用这个:

    select amount into whamount from warehouses where product = idprod;
    update warehouses set amount = whamount * new.amount where product = idprod;
    

    或者更好,只需一次更新:

    update warehouses set amount = amount * new.amount where product = idprod;
    

    如果您选择后者,那么您的 DECLARE 部分将不再需要 whamount

    另外,我认为您可以用一个 SELECT 替换前两个 SELECT。这两个:

    SELECT PRODUCT INTO idsupp from SUPPLIERS where ID = NEW.SUPPLIER;
    SELECT ID INTO idprod from PRODUCTS where ID = idsupp;
    

    可以替换为:

    select p.id into idprod
    from products p
    join suppliers s on p.id = s.product
    where s.id = new.supplier;
    

    然后你也不需要idsupp

    就调试而言,我唯一知道的是printf 式调试与raise notice;例如:

    raise notice 'idprod is "%"', idprod;
    

    【讨论】:

    • 感谢您的回答。我在另一个地方犯了错误,并且已经找到了。我会参考你的调试建议。
    【解决方案2】:

    对于调试,你也可以这样做:

    RAISE DEBUG 'some debug message and variable value: %', some_variable;
    

    然后您可以将日志级别设置为调试以输出调试信息。您可以保留这些调试语句,以便将来进行调查时,这些调试语句可能仍然有用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-12-10
      • 1970-01-01
      • 2012-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多