0

次のトリガーを書きました。

CREATE OR REPLACE FUNCTION tbl_scdr_insert_trigger() RETURNS TRIGGER AS $$
<< fk >>
DECLARE
    rowcount int;
    myrec RECORD;
BEGIN
    EXECUTE 'UPDATE sc_'|| to_char(NEW.start_datetime, 'YYYY_MM') ||' SET a = a + ($1).a, b = b + ($1).b WHERE (e_id = ($1).e_id AND start_datetime = ($1).start_datetime AND c_id = ($1).c_id'
    USING NEW;
    GET DIAGNOSTICS rowcount = ROW_COUNT;
    RAISE NOTICE 'found %', rowcount;
    IF not found THEN
        RAISE NOTICE 'not found';
    ELSIF found THEN
        RAISE NOTICE 'found';
        RETURN NULL;
    END IF;
END;
$$
LANGUAGE plpgsql;

Ever Called の場合、文はまだコミットされておらず、where 句の列の値が同じレコードが存在する場合でも、Found は常に False であるため、Rowcount として常に Zero が返されます。

4

1 に答える 1

2

PostgreSQLのドキュメントに次のように記載されています。

EXECUTE は GET DIAGNOSTICS の出力を変更しますが、FOUND は変更しません

つまり、静的 UPDATE ステートメントではなく EXECUTE を使用しているため、FOUND は常に FALSE になります。

于 2012-10-16T09:59:14.900 に答える