Commit
Gostaria de saber se existe uma maneira de executar um commit a cada mil linha de transação.
Exemplo: Minha transação contem 5 mil linhas e quando eu dou um commit ele me retorna erro por ser grande de mais.
Sei que não é assim, mas eu poderia dar um commit(1000) e ele faria as primeiras mil transações em seguida as outras mil e assim por diante até terminar. Mas de uma forma automática.
Exemplo: Minha transação contem 5 mil linhas e quando eu dou um commit ele me retorna erro por ser grande de mais.
Sei que não é assim, mas eu poderia dar um commit(1000) e ele faria as primeiras mil transações em seguida as outras mil e assim por diante até terminar. Mas de uma forma automática.
Nsconsultoria
Curtidas 0
Respostas
Motta
29/06/2005
qual erro que dá ?
Como é este update ?
Como é este update ?
GOSTEI 0
Marcio.theis
29/06/2005
Você pode utilizar o comando AUTOCOMMIT, desta forma:
SET AUTOCOMMIT 1000
no caso ira efetuar um commit a cada 1000 INSERT, UPDATE ou DELETE...
e ainda caso o controle AUTOCOMMIT seja ON ou IMMEDIATE, as alterações após a execução de cada comando ou cada bloco serão automaticamente confirmadas, OFF permite apenas COMMIT explícito via comando
então pode ser
SET AUTOCOMMIT OFF/ON/IMMEDIATE/n
SET AUTOCOMMIT 1000
no caso ira efetuar um commit a cada 1000 INSERT, UPDATE ou DELETE...
e ainda caso o controle AUTOCOMMIT seja ON ou IMMEDIATE, as alterações após a execução de cada comando ou cada bloco serão automaticamente confirmadas, OFF permite apenas COMMIT explícito via comando
então pode ser
SET AUTOCOMMIT OFF/ON/IMMEDIATE/n
GOSTEI 0
Nsconsultoria
29/06/2005
[color=blue:83fb8e3d04]Olá Márcio André Theis,
Obrigado pela solução.
O código com o problema esta abaixo. Você poderia me demostrar com o próprio código a sua solução.
Obrigado novamente.[/color:83fb8e3d04]
Declare
-- Declaração do Cursor
CURSOR TblPeriodo IS
Select Distinct DtOcorrencia
From StatusAgencia
Where DtOcorrencia <= TO_CHAR(ADD_MONTHS(SYSDATE,-3),´YYYYMMDD´);
-- Declaração da variável utilizada pelo Cursor
v_TblPeriodo TblPeriodo¬ROWTYPE;
Begin
-- Abertura do Cursor
Open TblPeriodo;
Fetch TblPeriodo Into v_TblPeriodo;
While TblPeriodo¬FOUND Loop
-- DBMS_OUTPUT.PUT_LINE(v_TblPeriodo.DtOcorrencia);
ClearReg(v_TblPeriodo.DtOcorrencia);
COMMIT;
Fetch TblPeriodo Into v_TblPeriodo;
End Loop;
-- Fechamento do Cursor
Close TblPeriodo;
COMMIT;
-- Tratamento de Erro
EXCEPTION
-- Para qualquer tipo erro será realizado um Rollback
WHEN OTHERS THEN
ROLLBACK;
End;
/
Obrigado pela solução.
O código com o problema esta abaixo. Você poderia me demostrar com o próprio código a sua solução.
Obrigado novamente.[/color:83fb8e3d04]
Declare
-- Declaração do Cursor
CURSOR TblPeriodo IS
Select Distinct DtOcorrencia
From StatusAgencia
Where DtOcorrencia <= TO_CHAR(ADD_MONTHS(SYSDATE,-3),´YYYYMMDD´);
-- Declaração da variável utilizada pelo Cursor
v_TblPeriodo TblPeriodo¬ROWTYPE;
Begin
-- Abertura do Cursor
Open TblPeriodo;
Fetch TblPeriodo Into v_TblPeriodo;
While TblPeriodo¬FOUND Loop
-- DBMS_OUTPUT.PUT_LINE(v_TblPeriodo.DtOcorrencia);
ClearReg(v_TblPeriodo.DtOcorrencia);
COMMIT;
Fetch TblPeriodo Into v_TblPeriodo;
End Loop;
-- Fechamento do Cursor
Close TblPeriodo;
COMMIT;
-- Tratamento de Erro
EXCEPTION
-- Para qualquer tipo erro será realizado um Rollback
WHEN OTHERS THEN
ROLLBACK;
End;
/
GOSTEI 0
Marcio.theis
29/06/2005
Antes de executar o seu cursor de um
SET AUTOCOMMIT ON
e depois que terminar um
SET AUTOCOMMIT OFF
SET AUTOCOMMIT ON
e depois que terminar um
SET AUTOCOMMIT OFF
GOSTEI 0
Nsconsultoria
29/06/2005
Márcio André Theis,
Obrigado novamente pela atenção.
Sei que a solução é clara para você, mas como não conheço o comando, gostaria de saber o seguinte:
Antes de executar o seu cursor de devo dar um SET AUTOCOMMIT ON
Depois de executar o cursor, devo dar um SET AUTOCOMMIT OFF
E o SET AUTOCOMMIT 1000 em que momento eu devo executar?
Obrigado novamente pela atenção.
Sei que a solução é clara para você, mas como não conheço o comando, gostaria de saber o seguinte:
Antes de executar o seu cursor de devo dar um SET AUTOCOMMIT ON
Depois de executar o cursor, devo dar um SET AUTOCOMMIT OFF
E o SET AUTOCOMMIT 1000 em que momento eu devo executar?
GOSTEI 0
Marcio.theis
29/06/2005
Se vc setar o AUTOCOMMIT 1000 ira informar q ele deve efetuar um commit a cada 1000 insert, update ou delete, mas se setar como AUTOCOMMIT ON ou IMMEDIATE, ira informar q ele deve executar o commit a cada comando ou a cada bloco de comando.
GOSTEI 0
Nsconsultoria
29/06/2005
Olá Márcio André Theis
Alterei o código como você pode ver abaixo em azul, entretanto a alteração causou o seguinte erro:
Removi a linha SET AUTOCOMMIT 1000 e ele executou normalmente.
O que pode ter ocorrido de errado? Você pode continuar me ajudando?
Obrigado,
Nilton
[b:aff10febd2]-- Declaração do Cursor
*
ERROR at line 3:
ORA-06550: line 15, column 6:
PL/SQL: ORA-00922: missing or invalid option
ORA-06550: line 15, column 2:
PL/SQL: SQL Statement ignored
** Mon Jul 11 10:42:23 GRNLNDST 2005 [/b:aff10febd2]
[/b]
[color=blue:aff10febd2][/color:aff10febd2]
Declare
-- Declaração do Cursor
CURSOR TblPeriodo IS
Select Distinct DtOcorrencia
From StatusAgencia
Where DtOcorrencia <= TO_CHAR(ADD_MONTHS(SYSDATE,-3),´YYYYMMDD´);
-- Declaração da variável utilizada pelo Cursor
v_TblPeriodo TblPeriodo¬ROWTYPE;
Begin
-- Abertura do Cursor
SET AUTOCOMMIT 1000;
Open TblPeriodo;
Fetch TblPeriodo Into v_TblPeriodo;
While TblPeriodo¬FOUND Loop
-- DBMS_OUTPUT.PUT_LINE(v_TblPeriodo.DtOcorrencia);
ClearReg(v_TblPeriodo.DtOcorrencia);
COMMIT;
Fetch TblPeriodo Into v_TblPeriodo;
End Loop;
-- Fechamento do Cursor
Close TblPeriodo;
COMMIT;
-- Tratamento de Erro
EXCEPTION
-- Para qualquer tipo erro será realizado um Rollback
WHEN OTHERS THEN
ROLLBACK;
End;
/
Alterei o código como você pode ver abaixo em azul, entretanto a alteração causou o seguinte erro:
Removi a linha SET AUTOCOMMIT 1000 e ele executou normalmente.
O que pode ter ocorrido de errado? Você pode continuar me ajudando?
Obrigado,
Nilton
[b:aff10febd2]-- Declaração do Cursor
*
ERROR at line 3:
ORA-06550: line 15, column 6:
PL/SQL: ORA-00922: missing or invalid option
ORA-06550: line 15, column 2:
PL/SQL: SQL Statement ignored
** Mon Jul 11 10:42:23 GRNLNDST 2005 [/b:aff10febd2]
[/b]
[color=blue:aff10febd2][/color:aff10febd2]
Declare
-- Declaração do Cursor
CURSOR TblPeriodo IS
Select Distinct DtOcorrencia
From StatusAgencia
Where DtOcorrencia <= TO_CHAR(ADD_MONTHS(SYSDATE,-3),´YYYYMMDD´);
-- Declaração da variável utilizada pelo Cursor
v_TblPeriodo TblPeriodo¬ROWTYPE;
Begin
-- Abertura do Cursor
SET AUTOCOMMIT 1000;
Open TblPeriodo;
Fetch TblPeriodo Into v_TblPeriodo;
While TblPeriodo¬FOUND Loop
-- DBMS_OUTPUT.PUT_LINE(v_TblPeriodo.DtOcorrencia);
ClearReg(v_TblPeriodo.DtOcorrencia);
COMMIT;
Fetch TblPeriodo Into v_TblPeriodo;
End Loop;
-- Fechamento do Cursor
Close TblPeriodo;
COMMIT;
-- Tratamento de Erro
EXCEPTION
-- Para qualquer tipo erro será realizado um Rollback
WHEN OTHERS THEN
ROLLBACK;
End;
/
GOSTEI 0