在PostgreSQL中,从一个存储过程调用多个存储过程,其中包含多个事务

pod7payv  于 2023-08-04  发布在  PostgreSQL
关注(0)|答案(1)|浏览(221)

我有一个名为run_proc的存储过程,它调用了另外三个存储过程,其中一个存储过程的结果作为参数执行另一个存储过程:

CREATE OR REPLACE PROCEDURE run_proc() LANGUAGE plpgsql AS $$ DECLARE
    _store RECORD;
    _date RECORD; BEGIN
    CALL sp1();
    FOR _store IN SELECT * FROM temp_stores
    LOOP
        CALL sp2(_store.store_id);
        -- Check if temp_year_month has any data
        IF EXISTS (SELECT 1 FROM temp_year_month) THEN
            FOR _date IN SELECT * FROM temp_year_month
            LOOP
                CALL sp3(_store.store_id, _date.year_month);
            END LOOP;
        END IF;
        -- Drop dates table after use
        DROP TABLE temp_year_month;
    END LOOP;
    -- Don't forget to drop the tenants table when done
    DROP TABLE temp_stores; END; $$

字符串
上面的过程可以正常工作,但是在temp_stores包含大约1000条记录的情况下,上面的存储过程执行并将结果一次性提交到DB中(sp3包含一些inserts/update语句),我如何才能使temp_stores中的每个_store值单独提交到DB中,因为PostgreSQL不支持自治事务,有什么方法可以处理?

baubqpgj

baubqpgj1#

CREAR O REEMPLAZAR FUNCIÓN run_proc() RETORNA VOID AS $$
DECLARE
    _store RECORD;
    _fecha RECORD;
BEGIN
    
    FOR _store IN SELECT * FROM temp_stores LOOP
        
        CALL sp2(_store.store_id);

       
        IF EXISTS (SELECT 1 FROM temp_year_month) THEN
            
            FOR _date IN SELECT * FROM temp_year_month LOOP
                
                CALL sp3(_store.store_id, _date.year_month);
            END LOOP;
        END IF;
        DROP TABLE temp_year_month;
    END LOOP;

    DROP TABLE temp_stores;
END;
$$ LANGUAGE plpgsql;

字符串
使用这个PL/pgSQL函数,由于使用了FOR控制结构,temp_stores的每个_store值都将单独提交给数据库... LOOP以及开始和END块中SP调用的分组。每次迭代都将作为PL/pgSQL函数上下文中的一个单独事务,允许您为每个in _store值独立运行SP并将更改提交到数据库。

相关问题