ポストグルでトリガ

私はPostgreSQL用のPL/pgSQLで簡単なトリガを書いていますが、私が計画したように動作しません。私は2つの質問があります:

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

2 答え

Your if (idprod > 0) would probably better written as if idprod is not null but idprod > 0 should work.

私はエラーがここにあると推測しています:

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;

1つのUPDATEでそれを行う:

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

後者の場合、DECLAREセクションに whamount は必要ありません。

また、最初の2つのSELECTを1つの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 スタイルのデバッグです。 and-messages.html "rel =" nofollow "> raise notice ;例えば:

raise notice 'idprod is "%"', idprod;
2
追加された
答えてくれてありがとう。私は別の場所で間違いを犯し、すでにそれを見つけました。私はあなたのデバッグアドバイスを調べます。
追加された 著者 evilgeniuz,

デバッグの場合は、次のようにすることもできます。

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

ログレベルをデバッグに設定して、デバッグを出力することができます。これらのデバッグステートメントを今後も調査している場合は、これらのデバッグステートメントを有効にしておくことができます。

0
追加された