курсор firebird переместить несколько строк tableA в tableB - PullRequest
0 голосов
/ 06 ноября 2019

Я хочу переместить определенные строки (некоторые поля) из таблицы A в таблицу B, удалив эти строки из tableA.

Я использую Delphi версия Rio с FireDAC с Firebird RDMBS.

  1. Я использую процедуру для перемещения и удаления одной строки
  2. Я не могу использовать этот курсор для перемещения нескольких строк

Я использую процедуру 1 дляпереместить и удалить одну строку. Проблема заключается в том, что при использовании процедуры 2 (EXECUTE PROCEDURE "PRST_RetransFert";) появляется сообщение об ошибке:

Ошибка двигателя (код = 335544336): тупик.
Обновление конфликтует с одновременным обновлением.
номер параллельной транзакции: 41556.
В строке процедуры 'PRST_INSERTMEMODELETTRANSF': 36, столбец: 3
В строке процедуры 'PRST_RetransFert': 13, столбец: 15.
Ошибка SQL (код = -913): тупик.

Эта процедура сама по себе работает нормально.

RECREATE PROCEDURE PRST_INSERTMEMODELETTRANSF (
 IDTRANSFMEMO INTEGER)
AS 
declare variable numero varchar(10);
declare variable sommetransf decimal(15,2);
declare variable crdtransf smallint;
declare variable marge decimal(15,2);
declare variable idut integer;
declare variable idcl integer;
declare variable optionenvoie integer;
declare variable idop integer;
declare variable idoptionoperat integer;
declare variable naturetransf varchar(25);
declare variable codetransfert varchar(25);
declare variable coderapel varchar(25);
declare variable codepin varchar(25);
declare variable avantconnect smallint;
declare variable etattransf varchar(255);
begin
  /* Procedure Text */
   :etattransf = '....NON TRANSMIS RETRANSFERE EN ATTENTE.....' ;
   :AVANTCONNECT = 0 ;
   select numero ,somme ,credit_cl ,marge,id_ut ,
                    id_cl , option_envoie ,id_op  ,id_option_operat
                    ,nature_transf ,code_transfert  , code_rapel  ,Code_pin
                    from  v_nontransmi  where id_transfmemo = :idtransfmemo
                      into :numero,:sommetransf , :CRDTRANSF , :marge  , :idut
                                         , :idcl   , :optionenvoie   , :idop  , idoptionoperat  , :naturetransf
                                           , :codetransfert , :coderapel , :codepin ;

  insert  into transfertsmemoire (numero, somme_transf, crd_transf, marge, id_ut, etat_transf, id_cl, avant_connect,
                                 option_envoie, id_op, id_option_operat, nature_transf, code_transfert, code_rapel, code_pin)
                          Values (:Numero,:sommetransf, :crdtransf,:marge,:idut,:etattransf,:idcl, :avantconnect,:optionenvoie,:idop,
                                 :idoptionoperat,:naturetransf,:codetransfert,:coderapel,:codepin);

  delete from transferts where id_transfmemo = :idtransfmemo ;
--  suspend;
end

Я не могу использовать этот SP для перемещения нескольких строк

RECREATE PROCEDURE "PRST_RetransFert"
AS 
declare variable id_trsMem integer ;  
declare curIdMemoTran Cursor for 
  (select id_transfmemo from v_nontransmi);
   begin  
    open curIdMemoTran;
      while (row_count > 0) do
          begin
              fetch curIdMemoTran into :id_trsMem ;
              execute procedure prst_insertmemodelettransf (:id_trsMem);
              if (row_count = 0) then leave;
            suspend;
          end
  close curIdMemoTran ;
end
...