Transações no Interbase ****URGENTE*****
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
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
Curtidas 0
Respostas
Afarias
23/09/2003
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+
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+
GOSTEI 0
Svaz
23/09/2003
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
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
GOSTEI 0
Afarias
23/09/2003
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+
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+
GOSTEI 0
Svaz
23/09/2003
ok, muito obrigado, estarie testando...
GOSTEI 0