PostgreSQL- 如果 table 中的数据,则为存储过程删除

PostgreSQL- If data in table, delete for stored procedure

我有这个过程,我用 CALL pr_calc_quarter(2,2022) 调用它,它从查询中将数据插入到 table erp.tb_quarter 中。 我需要添加代码来检查 table 中是否已有数据,以便在插入新值之前将其删除。

我想在开头或插入之前插入代码,但我不知道 如何检查 table.

上是否已经有数据

我只需要如何进行检查,不需要工作演示 :)。我不知道 trigger before insert 是否可以在这里使用过程中的参数。

程序:

CREATE OR REPLACE PROCEDURE pr_calc_quarter( trimestre INT , anio INT ) AS $$
DECLARE
    v_cust_no CHARACTER(5);
    v_iva_percent INT;
    v_amount REAL;
BEGIN
        FOR trimestre, anio, v_cust_no, v_iva_percent, v_amount IN
            SELECT
                EXTRACT(QUARTER FROM i.last_update_date) AS quarter,
                EXTRACT(year FROM i.last_update_date)  AS year,
                c.cust_no,
                round((i.iva_amount * 100 / net_amount)::numeric,0) AS iva_percent,
                SUM(i.iva_amount) AS amount
            FROM erp.tb_customer c JOIN erp.tb_invoice i ON i.cust_no = c. cust_no
            WHERE EXTRACT(QUARTER FROM i.last_update_date) = trimestre AND EXTRACT(year FROM i.last_update_date) = anio
            GROUP BY iva_percent, c.cust_no, year, quarter
            ORDER BY c.cust_no, iva_percent, amount
            LOOP
            INSERT INTO erp.tb_quarter
            VALUES (trimestre, anio, v_cust_no, v_iva_percent, v_amount);
            END LOOP;
END;
$$ LANGUAGE plpgsql;  

如果您总是想从 table 中删除所有数据,那么只需始终

truncate erp.tb_quarter;

放在BEGIN

之后的下一行

如果您只想删除计算范围内的数据,请使用 where

delete

此外,您可以使用 INSERT INTO ... SELECT FROM 构造

代替循环

Example