Procedure não faz insert

Dúvidas, dicas e truques de PL/SQL. Aqui também vão assuntos relacionados a pacotes, triggers, funções, Java-Stored Procedures, etc
Responder
paulo.pcrp
Rank: Estagiário Júnior
Rank: Estagiário Júnior
Mensagens: 2
Registrado em: Ter, 14 Ago 2012 10:26 am

bom dia.

estou precisando uma ajuda com a execução de uma procedure, a ideia primaria é a seguinte, eu faço um um select, para pegar os dados requisitados, apos isso, eu tenho que fazer um update e um insert, tudo na mesma tabela, porem, minha procedure esta fazendo o update, mas não esta fazendo o insert. fiz um contador tambem para que a cada mil registros ele faça o commit.

desde já agradeço a ajuda

estou colando o codigo abaixo:


/*
Procedure altera plano contas
PC
14/08/2012
*/

Selecionar tudo

CREATE OR REPLACE PROCEDURE ALTERA_DADOS

cursor c_tst is -- crio o cursor para armazenar query

IS BEGIN
    FOR V_FUNC IN
      (SELECT *
      FROM  EVENDESP TABOR 
      INNER JOIN EMS505BPORO8P930ESP.ESP_DEPARA TMPTAB ON (TMPTAB.CTA_PLANO_ANTIGO = TABOR.CT_CODIGO
                                                           AND TMPTAB.CTA_PLANO_ANTIGO <> TMPTAB.CTA_PLANO_NOVO)
      WHERE TABOR.AA_VALIDADE = 9999
        AND TABOR.MM_VALIDADE = 12
        AND TABOR.CT_CODIGO  <> ' ')
        
    LOOP
    
	open c_tst; --abro o cursor
	/*realizo u upd relacionado com o select para invalidar as contas velhas*/
         UPDATE EVENDESP 
          SET  AA_VALIDADE = 2012, 
               MM_VALIDADE = 06, 
               CD_USERID = 'ALT_ID_97962'
        WHERE AA_VALIDADE = v_func.AA_VALIDADE
          AND MM_VALIDADE = v_func.MM_VALIDADE
          AND CT_CODIGO   = v_func.CTA_PLANO_ANTIGO;
      
        BEGIN /*realizo o insert do novo plano de contas*/
    INSERT INTO EVENDESP
               (CD_EVENTO,
                CD_GRUPO_PRESTADOR,
                U##IN_MOVTO,
                IN_MOVTO,
                U##CDMODPLANOTIPOMODULO,
                CDMODPLANOTIPOMODULO,
                CD_FORMA_PAGTO,
                IN_TIPO_ATO,
                AA_VALIDADE,
                MM_VALIDADE,
                LG_INTERNADO,
                CD_GRUPO_TIPO,
                CD_PROC_INSUMO,
                CT_CODIGO,
                SC_CODIGO,
                CD_USERID,
                DT_ATUALIZACAO,
                CHAR_1,
                CHAR_2,
                CHAR_3,
                CHAR_4,
                CHAR_5,
                DEC_1,
                DEC_2,
                DEC_3,
                DEC_4,
                DEC_5,
                DATE_1,
                DATE_2,
                DATE_3,
                DATE_4,
                DATE_5,
                INT_1,
                INT_2,
                INT_3,
                INT_4,
                INT_5,
                LOG_1,
                LOG_2,
                LOG_3,
                LOG_4,
                LOG_5,
                U_CHAR_1,
                U_CHAR_2,
                U_CHAR_3,
                U_DATE_1,
                U_DATE_2,
                U_DATE_3,
                U_INT_1,
                U_INT_2,
                U_INT_3,
                U_LOG_1,
                U_LOG_2,
                U_LOG_3,
                U_DEC_1,
                U_DEC_2,
                U_DEC_3,
                CT_TP_CONTRATACAO1,
                SC_TP_CONTRATACAO1,
                CT_TP_CONTRATACAO3,
                SC_TP_CONTRATACAO3,
                CT_TP_CONTRATACAO4,
                SC_TP_CONTRATACAO4,
                CT_TP_CONTRATACAO5,
                SC_TP_CONTRATACAO5,
                CT_TP_CONTRATACAO6,
                SC_TP_CONTRATACAO6,
                AA_INICIO_VALIDADE,
                MM_INICIO_VALIDADE)
        VALUES
              ( V_FUNC.CD_EVENTO,
                V_FUNC.CD_GRUPO_PRESTADOR,
                V_FUNC.U##IN_MOVTO,
                V_FUNC.IN_MOVTO,
                V_FUNC.U##CDMODPLANOTIPOMODULO,
                V_FUNC.CDMODPLANOTIPOMODULO,
                V_FUNC.CD_FORMA_PAGTO,
                V_FUNC.IN_TIPO_ATO,
				9999,--ANO FIM CONTA DT-LIMITE-ORIGEM
				12, --mês FIM CONTA DT-LIMITE-ORIGEM
                V_FUNC.LG_INTERNADO,
                V_FUNC.CD_GRUPO_TIPO,
                V_FUNC.CD_PROC_INSUMO,
                V_FUNC.CT_CODIGO,
                V_FUNC.SC_CODIGO,
                'INC_ID_97962', -- novo registro incluido no novo plano de contas
                V_FUNC.DT_ATUALIZACAO,
                V_FUNC.CHAR_1,
                V_FUNC.CHAR_2,
                V_FUNC.CHAR_3,
                V_FUNC.CHAR_4,
                V_FUNC.CHAR_5,
                V_FUNC.DEC_1,
                V_FUNC.DEC_2,
                V_FUNC.DEC_3,
                V_FUNC.DEC_4,
                V_FUNC.DEC_5,
                V_FUNC.DATE_1,
                V_FUNC.DATE_2,
                V_FUNC.DATE_3,
                V_FUNC.DATE_4,
                V_FUNC.DATE_5,
                V_FUNC.INT_1,
                V_FUNC.INT_2,
                V_FUNC.INT_3,
                V_FUNC.INT_4,
                V_FUNC.INT_5,
                V_FUNC.LOG_1,
                V_FUNC.LOG_2,
                V_FUNC.LOG_3,
                V_FUNC.LOG_4,
                V_FUNC.LOG_5,
                V_FUNC.U_CHAR_1,
                V_FUNC.U_CHAR_2,
                V_FUNC.U_CHAR_3,
                V_FUNC.U_DATE_1,
                V_FUNC.U_DATE_2,
                V_FUNC.U_DATE_3,
                V_FUNC.U_INT_1,
                V_FUNC.U_INT_2,
                V_FUNC.U_INT_3,
                V_FUNC.U_LOG_1,
                V_FUNC.U_LOG_2,
                V_FUNC.U_LOG_3,
                V_FUNC.U_DEC_1,
                V_FUNC.U_DEC_2,
                V_FUNC.U_DEC_3,
                V_FUNC.CT_TP_CONTRATACAO1,
                V_FUNC.SC_TP_CONTRATACAO1,
                V_FUNC.CT_TP_CONTRATACAO3,
                V_FUNC.SC_TP_CONTRATACAO3,
                V_FUNC.CT_TP_CONTRATACAO4,
                V_FUNC.SC_TP_CONTRATACAO4,
                V_FUNC.CT_TP_CONTRATACAO5,
                V_FUNC.SC_TP_CONTRATACAO5,
                V_FUNC.CT_TP_CONTRATACAO6,
                V_FUNC.SC_TP_CONTRATACAO6,
                V_FUNC.AA_INICIO_VALIDADE,
                V_FUNC.MM_INICIO_VALIDADE );
				
		if contador = 1000 then -- a cada 1000 registros realizo o commit.
		commit; 
		contador :=0; -- zero o contador
		end if; 
		contador := contador +1; -- incremento 1
		
    END;
    
    COMMIT;

    END LOOP;
	close c_tst;

	Update set progress_recid = rownum;

END;
Tinho
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 318
Registrado em: Seg, 16 Nov 2009 4:50 pm
Localização: São Paulo - SP

Caro, Paulo.

Eu não estou com embasamento técnico para lhe afirmar isso com toda a certeza. Mas existe uma hierárquia de execução dos comandos no oracle. A minha dúvida é como o Oracle organiza este processo quando você tem dois comandos aberto, digo, qual é efetivado, o primeiro o último, essa é minha dúvida.

Pelo o que você está relatando, está sendo executado apenas o primero script DML, neste caso o UPDATE, portanto de acordo com este cenário está sendo efetivado a primeira instrução após o commit.

Não sei se deu para entender bem a idéia, pois no momento que você startou o comando, é como se a tabela ficasse lockada aguardando um commit ou um rollback. Ou seja, para que você possa executar os dois comandos, é preciso fechar uma transação para depois abrir outra.

Então dependendo do seu caso, sugiro que você coloque os dois em loop diferentes ou antes de iniciar um encerre o anterior.

Espero ter ajudado.

Att.,
schnu
Rank: Analista Pleno
Rank: Analista Pleno
Mensagens: 110
Registrado em: Ter, 24 Mai 2005 9:16 pm
Localização: Dongguan - Guangdong - China
Deus criou os loucos para confundir os sábios

Paulo

Coloca um exception when other depois do insert, algo tipo assim:

Selecionar tudo

EXCEPTION
   WHEN OTHERS THEN
      err_num := SQLCODE;
      err_msg := SUBSTR(SQLERRM, 1, 100);
      INSERT INTO errors VALUES (err_num, err_msg);
E veja qual o erro que está ocorrendo no insert e se continuar com dúvidas nos mande o erro encontrado
rogenaro
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 232
Registrado em: Sex, 30 Mar 2007 7:26 pm
Localização: Londrina - PR
Rafael O. Genaro

Pela procedure, não teria como o insert se ignorado.
Fazendo um count antes e depois de executá-la, a quantidade de registros permanece igual?
Será que o update não estaria atualizando os registros que foram inseridos anteriormente?
Tinho
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 318
Registrado em: Seg, 16 Nov 2009 4:50 pm
Localização: São Paulo - SP

Paulo,

Pelo o que eu entendi do seu script a rotina de atualização das contas velhas é independente da rotina que irá inserir os dados na tabela. Ou seja, uma transação não depende da outra. Porém como os dois scripts são executados sobre a mesma tabela, ao executar o UPDATE você está lockando a tabela até que o processo encontre um COMMIT ou um ROLLBACK, neste caso ele está encontrando um outro DML, assim sendo, quando é feito o COMMIT o script é efetivado e como a tabela está lockada para o primeiro comando apenas o UPDATE é realizado.

Tente fazer da seguinte maneira:

Selecionar tudo


BEGIN
-- realizo u upd relacionado com o select para invalidar as contas velhas
UPDATE EVENDESP
   SET  AA_VALIDADE = 2012,
        MM_VALIDADE = 06,
	    CD_USERID = 'ALT_ID_97962'
 WHERE AA_VALIDADE = v_func.AA_VALIDADE
   AND MM_VALIDADE = v_func.MM_VALIDADE
   AND CT_CODIGO   = v_func.CTA_PLANO_ANTIGO;

 COMMIT;
   
END;

Eu não vi em seu código a declaração da variável "contador" e nem a incrementação da mesma, considere a possibilidade da condição de verificação do seu contador estar equivocada.

Att.,
paulo.pcrp
Rank: Estagiário Júnior
Rank: Estagiário Júnior
Mensagens: 2
Registrado em: Ter, 14 Ago 2012 10:26 am

Bom dia.
Obrigado pessoal.

retirei o contador e fiz um commit apos o update, tambem tinha um erro na declaração das chaves de campo.

agora esta o.

obrigado.
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 6 visitantes