Re: [oracle_br] Re: Set Transaction

2009-05-20 Por tôpico Júlio César Corrêa
Concordo com o Chiappa.
Detalhe o SET TRANSACTION tem que ser o primeiro comando da transação.

Outros:

- O Oracle abre uma transação com um DML e termina a transação com Commit ou
Rollback.
- A transação é independente de bloco.
- Multiplas transações podem estar em um unico bloco.(No seu caso acontece
isso,você faz DML e logo após faz commit,faz dml,faz commit).

Você não tem transação autonoma que poderia ser o problema,tipo você
especifica um rollback segment e abre uma transação autonoma,esta nova
transação é independente portanto não usaria mesmo o Rollback segment.


Sobre o erro ORA-01555 é como o Chiappa falou comfigure um tamanho ideal
para você e be happy.

Fique de olho se você não chama outra procedure e esta  abre outras
transações sem o uso do rollback segment que você quer.

Abs,


2009/5/20 jlchiappa jlchia...@yahoo.com.br



 Colega, deixa eu me meter aí, vamos dar uns palpites : não, não tem NADA a
 ver usra o SET TRANSACTION num EXECUTE IMMEDIATE, ele é totalmente aceito em
 PL/SQL. Uma coisa que pode estar pegando é que essse comando TEM que ser o
 primeiro DA TRANSAÇÃO, e não o primeiro DA PROCEDURE. Quero dizer o seguinte
 : imagine que eu acabei de conectar no banco, faço uns SELECTs apenas, coisa
 e tal, e executo a tua procedure CARGA_ANALISE_INADIMPLENCIA : como não
 tenho nada pendente, não tenho INSERT/UPDATE/DELETE pendente (ou seja, não
 TRANSAÇÂO aberta) o cara funciona.
 OK, imagine agora que em outra sessão antes de executar a tua procedure eu
 fiz outras coisas, chamei outras rotinas que fazem DMLs - nesse instante eu
 executo a CARGA_ANALISE_INADIMPLENCIA, como JÁ TENHO outros
 INSERTs/UPDATE/DELETEs pendentes, eu JÁ TENHO transação aberta, o SET
 TRANSACION ** não ** está sendo executado como o primeiro comando da
 transação, ele NÂO VAI funcionar Será que pode ser isso o seu problema
 ?? Algo me diz que sim...

 E é claro : a maneira correta e recomendável de se trabalhar é : se vc sabe
 que precisará de x bytes de rollback, *** SEMPRE *** deveria se ter TODOS os
 segmentos de rollback com o MESMO tamanho, aí qualquer um é qualquer um, E
 preferencialmente se usar undo automático, SE a sua versão (que vc NÃO DIZ
 qual é, pra variar) suporta... Esse negócio de tentar ficar fazendo economia
 de feijõezinhos no tamanho da tablespace de rollback/undo quase NUNCA dá
 certo, e quase sempre dá é prejuízo, crie do tamanho que é preciso e be
 happy...

 []s

 Chiappa
 --- Em oracle_br@yahoogrupos.com.br oracle_br%40yahoogrupos.com.br,
 Eduardo Abrantes de Souza eduardo.abran...@... escreveu

 
  Esta é a parte principal. Agora eu te pergunto: set transaction use
 rollback segment RBS_INAD, tem que ser via EXECUTE_IMMEDIATE, ou não
 importa? Isto porque este comando parece não estar funcionando, pois o
 segmento de rollback alocado não é o RBS_INAD. Ele pega um dos defaults.
 Obrigado pela ajuda. Grande abraço.
 
 
  PROCEDURE CARGA_ANALISE_INADIMPLENCIA (p_hora_limite in number)
  IS
  PE_PROCESSO VARCHAR2(1000);
  MENS_ERRO VARCHAR2(400);
  v_mensagem varchar2(100);
  ERRO EXCEPTION;
 
  BEGIN
  set transaction use rollback segment RBS_INAD;
  v_mensagem := null;
  p_excluir_pedidos_15_dias(v_mensagem);
  if v_mensagem is not null then
  mens_erro := 'Erro ao excluir pedidos com mais de 15 dias '||v_mensagem;
  raise erro;
  end if;
  CARGA_DADOS_FINANCEIRO (MENS_ERRO);
  IF MENS_ERRO IS NOT NULL THEN
  update SELEC_ANALISE_INADIMPLENCIA set CD_SIT_PEDIDO = 9
  where CD_SIT_PEDIDO = 0;
  commit;
  set transaction use rollback segment RBS_INAD;
  RAISE ERRO;
  END IF;
  FOR C1 IN ( SELECT S.*,C.*
  FROM SELEC_ANALISE_INADIMPLENCIA S, CONFIG_ANALISE_INADIMPLENCIA C
  WHERE CD_SIT_PEDIDO IN (0) order by s.nr_pedido)
  LOOP
  if to_number(to_char(sysdate,'hh24mi')) = p_hora_limite
  then
  insert into fcbatch values ('ANL_INAD','Ultrapassou Hora Limite
 '||to_char(p_hora_limite,'0999')||' '||to_char(sysdate,'dd/mm/yy
 hh24:mi:ss'),NULL,to_char(sysdate,'dd/mm/yy
 hh24:mi:ss'),userenv('SESSIONID'),SYSDATE);
  commit;
  set transaction use rollback segment RBS_INAD;
  exit;
  end if;
  insert into fcbatch values ('ANL_INAD',' Fim da execucao do pedido
 '||c1.nr_pedido||' - '||to_char(sysdate,'dd/mm/yy
 hh24:mi:ss'),to_char(sysdate,'dd/mm/yy
 hh24:mi:ss'),NULL,userenv('SESSIONID'),SYSDATE);
  commit;
  set transaction use rollback segment RBS_INAD;
  END LOOP;
  commit;
  set transaction use rollback segment RBS_INAD;
 
  EXCEPTION
  WHEN OTHERS THEN
  MENS_ERRO := 'Erro na procedure CARGA_ANALISE_INADIMPLENCIA -
 '||SQLERRM;
  commit;
  set transaction use rollback segment RBS_INAD;
  END;
 
  -Original Message-
  From: oracle_br@yahoogrupos.com.br oracle_br%40yahoogrupos.com.br[mailto:
 oracle_br@yahoogrupos.com.br oracle_br%40yahoogrupos.com.br] On Behalf
 Of Júlio César Corrêa
  Sent: terça-feira, 19 de maio de 2009 22:54
  To: oracle_br@yahoogrupos.com.br oracle_br%40yahoogrupos.com.br
  Subject: Re: [oracle_br] Set Transaction
 
  Passa o código ou trecho dele.
 
  

RE: [oracle_br] Re: Set Transaction

2009-05-20 Por tôpico Eduardo Abrantes de Souza
Valeu, amigos.  Com estes dados e mais uma bateria de testes acho que vou 
conseguir acertar.

Chiappa, realmente, com ou sem execute immediate o segmento de rollback é 
setado (Fiz uma procedure de teste).  

O que deve estar acontecendo é a chamada de outras procedures ou funções e ai o 
segmento deve se alterar ou perder/desfazer o ponteiro feito no set transaction.

Estamos juntos!!!

-Original Message-
From: oracle_br@yahoogrupos.com.br [mailto:oracle...@yahoogrupos.com.br] On 
Behalf Of Júlio César Corrêa
Sent: quarta-feira, 20 de maio de 2009 11:23
To: oracle_br@yahoogrupos.com.br
Subject: Re: [oracle_br] Re: Set Transaction

Concordo com o Chiappa.
Detalhe o SET TRANSACTION tem que ser o primeiro comando da transação.

Outros:

- O Oracle abre uma transação com um DML e termina a transação com Commit ou
Rollback.
- A transação é independente de bloco.
- Multiplas transações podem estar em um unico bloco.(No seu caso acontece
isso,você faz DML e logo após faz commit,faz dml,faz commit).

Você não tem transação autonoma que poderia ser o problema,tipo você
especifica um rollback segment e abre uma transação autonoma,esta nova
transação é independente portanto não usaria mesmo o Rollback segment.


Sobre o erro ORA-01555 é como o Chiappa falou comfigure um tamanho ideal
para você e be happy.

Fique de olho se você não chama outra procedure e esta  abre outras
transações sem o uso do rollback segment que você quer.

Abs,


2009/5/20 jlchiappa jlchia...@yahoo.com.br



 Colega, deixa eu me meter aí, vamos dar uns palpites : não, não tem NADA a
 ver usra o SET TRANSACTION num EXECUTE IMMEDIATE, ele é totalmente aceito em
 PL/SQL. Uma coisa que pode estar pegando é que essse comando TEM que ser o
 primeiro DA TRANSAÇÃO, e não o primeiro DA PROCEDURE. Quero dizer o seguinte
 : imagine que eu acabei de conectar no banco, faço uns SELECTs apenas, coisa
 e tal, e executo a tua procedure CARGA_ANALISE_INADIMPLENCIA : como não
 tenho nada pendente, não tenho INSERT/UPDATE/DELETE pendente (ou seja, não
 TRANSAÇÂO aberta) o cara funciona.
 OK, imagine agora que em outra sessão antes de executar a tua procedure eu
 fiz outras coisas, chamei outras rotinas que fazem DMLs - nesse instante eu
 executo a CARGA_ANALISE_INADIMPLENCIA, como JÁ TENHO outros
 INSERTs/UPDATE/DELETEs pendentes, eu JÁ TENHO transação aberta, o SET
 TRANSACION ** não ** está sendo executado como o primeiro comando da
 transação, ele NÂO VAI funcionar Será que pode ser isso o seu problema
 ?? Algo me diz que sim...

 E é claro : a maneira correta e recomendável de se trabalhar é : se vc sabe
 que precisará de x bytes de rollback, *** SEMPRE *** deveria se ter TODOS os
 segmentos de rollback com o MESMO tamanho, aí qualquer um é qualquer um, E
 preferencialmente se usar undo automático, SE a sua versão (que vc NÃO DIZ
 qual é, pra variar) suporta... Esse negócio de tentar ficar fazendo economia
 de feijõezinhos no tamanho da tablespace de rollback/undo quase NUNCA dá
 certo, e quase sempre dá é prejuízo, crie do tamanho que é preciso e be
 happy...

 []s

 Chiappa
 --- Em oracle_br@yahoogrupos.com.br oracle_br%40yahoogrupos.com.br,
 Eduardo Abrantes de Souza eduardo.abran...@... escreveu

 
  Esta é a parte principal. Agora eu te pergunto: set transaction use
 rollback segment RBS_INAD, tem que ser via EXECUTE_IMMEDIATE, ou não
 importa? Isto porque este comando parece não estar funcionando, pois o
 segmento de rollback alocado não é o RBS_INAD. Ele pega um dos defaults.
 Obrigado pela ajuda. Grande abraço.
 
 
  PROCEDURE CARGA_ANALISE_INADIMPLENCIA (p_hora_limite in number)
  IS
  PE_PROCESSO VARCHAR2(1000);
  MENS_ERRO VARCHAR2(400);
  v_mensagem varchar2(100);
  ERRO EXCEPTION;
 
  BEGIN
  set transaction use rollback segment RBS_INAD;
  v_mensagem := null;
  p_excluir_pedidos_15_dias(v_mensagem);
  if v_mensagem is not null then
  mens_erro := 'Erro ao excluir pedidos com mais de 15 dias '||v_mensagem;
  raise erro;
  end if;
  CARGA_DADOS_FINANCEIRO (MENS_ERRO);
  IF MENS_ERRO IS NOT NULL THEN
  update SELEC_ANALISE_INADIMPLENCIA set CD_SIT_PEDIDO = 9
  where CD_SIT_PEDIDO = 0;
  commit;
  set transaction use rollback segment RBS_INAD;
  RAISE ERRO;
  END IF;
  FOR C1 IN ( SELECT S.*,C.*
  FROM SELEC_ANALISE_INADIMPLENCIA S, CONFIG_ANALISE_INADIMPLENCIA C
  WHERE CD_SIT_PEDIDO IN (0) order by s.nr_pedido)
  LOOP
  if to_number(to_char(sysdate,'hh24mi')) = p_hora_limite
  then
  insert into fcbatch values ('ANL_INAD','Ultrapassou Hora Limite
 '||to_char(p_hora_limite,'0999')||' '||to_char(sysdate,'dd/mm/yy
 hh24:mi:ss'),NULL,to_char(sysdate,'dd/mm/yy
 hh24:mi:ss'),userenv('SESSIONID'),SYSDATE);
  commit;
  set transaction use rollback segment RBS_INAD;
  exit;
  end if;
  insert into fcbatch values ('ANL_INAD',' Fim da execucao do pedido
 '||c1.nr_pedido||' - '||to_char(sysdate,'dd/mm/yy
 hh24:mi:ss'),to_char(sysdate,'dd/mm/yy
 hh24:mi:ss'),NULL,userenv('SESSIONID'),SYSDATE);
  commit;
  set transaction use rollback segment