Delphi 提交Firebird中存储过程插入的记录

Delphi 提交Firebird中存储过程插入的记录,delphi,firebird,Delphi,Firebird,我创建了以下存储过程 SET TERM ^ ; CREATE OR ALTER PROCEDURE EDIT_FATURA (fat_id integer, mflag integer) as begin update inv_lines set mflag = :mflag where fat_id = :fat_id; delete from inv_lines_temp where 1=1 ; insert into inv_lines_temp se

我创建了以下存储过程

SET TERM ^ ;  
CREATE OR ALTER PROCEDURE EDIT_FATURA (fat_id integer, mflag integer) as 
begin     
  update inv_lines set mflag = :mflag where fat_id = :fat_id;
  delete from inv_lines_temp where 1=1 ;     
  insert into inv_lines_temp select ID,CODE_ID,ADET,UNIT_PRICE,LINE_NET,LINE_VAT,KDV,LINE_GRAND,CRN 
from inv_lines where fat_id = :fat_id; 
end^  
SET TERM ; ^  
GRANT SELECT,UPDATE ON INV_LINES TO PROCEDURE EDIT_FATURA;  
GRANT SELECT,INSERT,DELETE ON INV_LINES_TEMP TO PROCEDURE EDIT_FATURA;  
GRANT EXECUTE ON PROCEDURE EDIT_FATURA TO SYSDBA;
使用下面的代码,我用我的Delphi应用程序调用存储过程

dm.q_genel.Close;     
dm.q_genel.SQL.Clear;     
dm.q_genel.SQL.Add('EXECUTE PROCEDURE EDIT_FATURA(:p1,:p2)');
dm.q_genel.ParamByName('p1').AsInteger := fid;
dm.q_genel.ParamByName('p1').AsInteger := sayi; 
dm.q_genel.execute;
如图所示,一些记录是通过在我的delphi应用程序中调用的存储过程插入到表中的

但由于它们在存储过程执行后不会提交,因此我无法访问应用程序中新插入的记录

如何提交存储过程插入的行,以便在应用程序中访问它们


据我所知,不允许在存储过程中“提交”

您必须启动事务,运行存储过程,然后在出现任何错误时提交或回滚。这是在应用程序中完成的,因此您的代码如下所示:

SET TERM ^ ;  
CREATE OR ALTER PROCEDURE EDIT_FATURA (fat_id integer, mflag integer) as 
begin     
  update inv_lines set mflag = :mflag where fat_id = :fat_id;
  delete from inv_lines_temp where 1=1 ;     
  insert into inv_lines_temp select ID,CODE_ID,ADET,UNIT_PRICE,LINE_NET,LINE_VAT,KDV,LINE_GRAND,CRN 
from inv_lines where fat_id = :fat_id; 
end^  
SET TERM ; ^  
GRANT SELECT,UPDATE ON INV_LINES TO PROCEDURE EDIT_FATURA;  
GRANT SELECT,INSERT,DELETE ON INV_LINES_TEMP TO PROCEDURE EDIT_FATURA;  
GRANT EXECUTE ON PROCEDURE EDIT_FATURA TO SYSDBA;
 begin
    dm.q_genel.Close;     
    dm.q_genel.SQL.Clear;     
    dm.q_genel.SQL.Add('EXECUTE PROCEDURE EDIT_FATURA(:p1,:p2)');
    dm.q_genel.ParamByName('p1').AsInteger := fid;
    dm.q_genel.ParamByName('p1').AsInteger := sayi; 
    try
      dm.<Database>.StartTransaction;
      dm.q_genel.execute;
      dm.<Database>.Commit;
    except
      dm.<Database>.Rollback;
      raise;
    end;      
  end;
开始
dm.q_genel.Close;
dm.q_genel.SQL.Clear;
dm.q_genel.SQL.Add('executeprocedure EDIT_FATURA(:p1,:p2)');
dm.q_genel.parabyname('p1')。AsInteger:=fid;
dm.q_genel.parabyname('p1')。AsInteger:=sayi;
尝试
dm..StartTransaction;
dm.q_genel.execute;
dm..Commit;
除了
dm..回滚;
提高;
结束;
结束;
或者,如果您想在提交之前读取记录,以便在某些情况下回滚,您可以更改数据库中的隔离级别,以便您可以读取记录,当然,只有或您的应用程序可以读取记录,在您进行提交之前,没有其他人可以读取记录