Postgresql plpgsql函数内的事务

Postgresql plpgsql函数内的事务,postgresql,transactions,plpgsql,Postgresql,Transactions,Plpgsql,我已经编写了一个自动化函数,如下所述,它根据一些规则调用一些其他函数。该函数为我提供了所需的结果,但我面临的问题是,在内部处理每个函数后,它不会提交数据。只有在主函数完成后,它才会提交整个数据。我想做一个内部事务,它应该在内部函数执行完成时提交数据。我尝试在每个PERFORM语句之后给出一个COMMIT语句,但是我得到一个错误,说“不能在PL/pgSQL中开始/结束事务” 有人能建议我如何在函数内部进行事务处理吗 CREATE OR REPLACE FUNCTION ccdb.fn_automa

我已经编写了一个自动化函数,如下所述,它根据一些规则调用一些其他函数。该函数为我提供了所需的结果,但我面临的问题是,在内部处理每个函数后,它不会提交数据。只有在主函数完成后,它才会提交整个数据。我想做一个内部事务,它应该在内部函数执行完成时提交数据。我尝试在每个PERFORM语句之后给出一个COMMIT语句,但是我得到一个错误,说“不能在PL/pgSQL中开始/结束事务”

有人能建议我如何在函数内部进行事务处理吗

CREATE OR REPLACE FUNCTION ccdb.fn_automation_for_updation()
  RETURNS void AS
$BODY$

DECLARE 
sec_col refcursor;
cnt integer;
sec_code ccdb.update_qtable%ROWTYPE;
new_cnt integer;

BEGIN

SELECT COUNT(*)
INTO cnt
FROM ccdb.update_qtable
WHERE status_flag IN (-1,1);

OPEN sec_col FOR
    SELECT * FROM ccdb.update_qtable WHERE status_flag IN (-1,1);

FOR i IN 1..cnt
LOOP

    FETCH sec_col INTO sec_code;

        PERFORM ccdb.o_dtr_update(sec_code.section_code);

        PERFORM ccdb.o_consumer_update_for_update(sec_code.section_code);

        PERFORM ccdb.o_consumer_update_for_insert(sec_code.section_code);

        PERFORM ccdb.o_bills_update_for_update(sec_code.section_code);

        PERFORM ccdb.o_bills_update_for_insert(sec_code.section_code);

        PERFORM ccdb.o_payments_update_for_update_new(sec_code.section_code);

        PERFORM ccdb.o_payments_update_for_insert(sec_code.section_code);

        PERFORM ccdb.o_payments_map_update_for_update(sec_code.section_code);

        PERFORM ccdb.o_payments_map_update_for_insert(sec_code.section_code);

        SELECT COUNT(*) INTO new_cnt FROM ccdb.update_qtable WHERE status_flag IN (-1,1);

        IF new_cnt > cnt
        THEN
            CLOSE sec_col;

            OPEN sec_col FOR
                SELECT * FROM ccdb.update_table WHERE status_flag IN (-1,1);

        cnt := new_cnt;

        END IF;

END LOOP;

CLOSE sec_col;

END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;

您无法在PostgreSQL中执行自治事务-其函数不支持自治事务

您必须使用DBLink

见:

(由于我关闭了邮局,所以标记为CW)