Postgresql

TO(回滾到保存點)處或附近的語法錯誤

  • August 15, 2021

以下 sql 是 FUNCTION 的一部分,我想回滾到 rbk SAVEPOINT:

 for ptrEnt in entite loop
     -- positionnement du point de retour pour une entité
   savepoint rbk;
     -- purge de la table des redevances de l''entite
   test := pckg_activ.initredevanceentite(ptrEnt.cod_ent);
     -- calcul de la redevance
     test := pckg_activ.calculredevanceentite(ptrEnt.cod_ent);
   -- controle calcul de la bonne execution pour l''entité
   if (test = 0) then
       -- initialisation des departements associes a une entite
       test := pckg_activ.initdepartement(ptrEnt.cod_ent);
     -- validation des modifications
     commit;
     -- generation de l''etat recapitulatif
     test := pckg_activ.recapentitegestionnaire(ptrEnt.cod_ent,ficHisto);
   else
       rollback TO SAVEPOINT rbk;
     report := jour + 7;
     update sav_rdv_date
         set date_dem = report
         where cod_ent = ptrEnt.cod_ent;
       RAISE NOTICE '!!erreur de patrimoine => abandon du traitement pour cette entite';
     commit;
   end if;
 end loop;

entite是一個已聲明的游標,for 循環位於BEGIN塊中。

我收到錯誤錯誤: syntax error at or near "TO"。我認為語法是正確的,它與游標有關嗎?

您不能在 PostgreSQL 函式中使用事務管理語句。

在 v11 中引入的過程中添加了對此的有限支持。

EXCEPTION但是您可以(隱式)通過在塊中使用子句來使用保存點。

所以而不是

LOOP
  SAVEPOINT a;

  /* something */

  IF /* something else */ THEN
     ROLLBACK TO SAVEPOINT a;
     /* still more */
  END IF;
END LOOP;

你應該使用

LOOP
  BEGIN
     /* something */

     IF /* something else */ THEN
        RAISE EXCEPTION 'catchme';
     END IF;
  EXCEPTION
     WHEN raise_exception THEN
        /* still more */
  END;
END LOOP;

引用自:https://dba.stackexchange.com/questions/265600