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 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
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