GARANTIR DESCONTO

Fórum Transações no Interbase ****URGENTE***** #38902

23/09/2003

0

Tenho que executar 5 StoreProcedures diferentes, de delete, insert e update. Preciso executalas em uma sequencia lógica... Pelo que sei o IB tem transação embuitida para casa sp executada, mas como coloco uma transação para o processo como um todo. Exemplo

execute sp_1
execute sp_2
execute sp_3
execute sp_4
execute sp_5

Quero testar o sucesso das 5 SP´s caso qualquer uma delas falhe, todas SP´s quer foram executas (devem receber ROLLBACK).

Obrigado


Svaz

Svaz

Responder

Posts

24/09/2003

Afarias

A informação q vc tem está *errada*! o IB não possui qualquer controle interno/embutido de transação por SP!

abra sua transação, execute os 5 SPs -- se tudo ocorrer OK dê um commit caso contrário, rollback

*não* há diferenças quanto a transações para qualquer operação no IB -- exceto manipulação de generators q não ocorrem no contexto de transações.


T+


Responder

Gostei + 0

24/09/2003

Svaz

Ok obrigado pela ajuda, mas ainda tenho alguns problemas. :oops:

estou executando estas SP´s da seguinte maneira

case 1
spProcessFiles.name := sp_1
case 2
spProcessFiles.name := sp_2
case 3
spProcessFiles.name := sp_3
case 3
spProcessFiles.name := sp_4

while not dstXML.Eof do begin
for intAux := 0 to dstXML.FieldCount - 1 do
spProcessFiles.Params.Items[intAux].Value := dstXML.Fields.Fields[intAux].Value;

onde dstXML é um clientDataset carregado com os paramentros para execução de cada SP, que depende do case anterior, portanto não tenho como iniciar um begin tran neste processo ou dá?

por exemplo, tenho a seguinte criação da SP a primeira a ser executada:


CREATE PROCEDURE SP_ATU_INDUSTRIAS (
CNPJINDUSTRIA VARCHAR(14),
NOMEINDUSTRIA VARCHAR(30),
APELIDOINDUSTRIA VARCHAR(30),
UFINDUSTRIA VARCHAR(2),
FONEINDUSTRIA VARCHAR(20),
FILIAL VARCHAR(20),
CIDADEINDUSTRIA VARCHAR(40)
) AS
BEGIN
UPDATE tbIndustrias SET
strNomeIndustria = :NomeIndustria,
strApelidoIndustria = :ApelidoIndustria,
strCidadeIndustria = :CidadeIndustria,
strUFIndustria = :UfIndustria,
strFoneIndustria = :FoneIndustria,
strFilial = :Filial
WHERE strCNPJIndustria = :CNPJIndustria;

Como colocar uma transação para esta SP e com If Erro <> 0 dar RoolBack? tentei fazer o seguinte:

CREATE PROCEDURE SP_ATU_INDUSTRIAS (
CNPJINDUSTRIA VARCHAR(14),
NOMEINDUSTRIA VARCHAR(30),
APELIDOINDUSTRIA VARCHAR(30),
UFINDUSTRIA VARCHAR(2),
FONEINDUSTRIA VARCHAR(20),
FILIAL VARCHAR(20),
CIDADEINDUSTRIA VARCHAR(40)
) AS
[b:a7636029d0]BEGIN TRAN[/b:a7636029d0]
UPDATE tbIndustrias SET
strNomeIndustria = :NomeIndustria,
strApelidoIndustria = :ApelidoIndustria,
strCidadeIndustria = :CidadeIndustria,
strUFIndustria = :UfIndustria,
strFoneIndustria = :FoneIndustria,
strFilial = :Filial
WHERE strCNPJIndustria = :CNPJIndustria;
[b:a7636029d0]IF @ERROR <> 0
ROOLBACK
ELSE
COMMIT TRAN[/b:a7636029d0]
END;

mas tb não funcionou, como posso colocar uma transação para este processo? como vc colocou antes de executar dar begin tran e depois se tudo deu certo commit senão rollback?

Obrigadopela ajuda


Responder

Gostei + 0

25/09/2003

Afarias

Vc *NÃO* pode controlar transações dentro de uma SP! As SP ocorrem no contexto de uma transação criada para ela e pronto!

controle a transação no seu código, ex (usando IBX)::

{ ... }

IBTransaction1.StartTransaction;
try
while not dstXML.Eof do begin
for intAux := 0 to dstXML.FieldCount - 1 do
spProcessFiles.Params.Items[intAux].Value := dstXML.Fields.Fields[intAux].Value;

// execute o(s) procedimento(s)
IBTransaction1.Commit;
except
IBTransaction1.Rollback;
end;

Admitindo q vc configurou IBTransaction1 como a transação de TODOS os seus procedures.


T+


Responder

Gostei + 0

25/09/2003

Svaz

ok, muito obrigado, estarie testando...


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar