游标firebird将表A的某些行移至表B

我想通过从tableA删除这些行来将特定行(某些字段)从表A移动到表B。

我将带有 FireDAC Delphi 版本Rio与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,etat_transf,avant_connect,code_pin)
                          Values (:Numero,:crdtransf,:etattransf,:avantconnect,:idoptionoperat,: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
wanlichangfeng 回答:游标firebird将表A的某些行移至表B

暂时没有好的解决方案,如果你有好的解决方案,请发邮件至:iooj@foxmail.com
本文链接:https://www.f2er.com/3149094.html

大家都在问