GARANTIR DESCONTO

Fórum Erro: ORA-01013 Usuário solicitou cancelamento da operação atual #563574

04/10/2016

0

Boa tarde!

Estou desenvolvendo uma procedure que está dando essa mensagem de erro após 2 minutos de sua execução.

Essa procedure é responsável por buscar dados de uma tabela que tem produtos cadastrados com seu valor, depois de pegar essas informações ela faz um INSERTde 120.000 produtos na tabela de custo.

Devido ao grande volume de dados está acontecendo esse erro, tentei usar o COMMIT logo após o INSERT e mesmo assim não adiantou nada. Tentei procurar algo relacionado a finalização da sessão e iniciar uma nova logo em seguida a cada 15 mil produtos inseridos não encontrei nada relacionado.

Alguém pode me ajudar?
Ulysses Ribeiro

Ulysses Ribeiro

Responder

Posts

05/10/2016

Roberto Spernega

Bom dia Ulysses,

Melhor você postar a PROCEDURE.
Fica mais fácil de achar uma solução.
Responder

Gostei + 0

05/10/2016

Ulysses Ribeiro

CREATE OR REPLACE PROCEDURE "STP_GRAVA_CUSTO_VOLGA"(P_CODUSU    NUMBER, -- Código do usuário logado
                                                    P_IDSESSAO  VARCHAR2, -- Identificador da execução. Serve para buscar informações dos parâmetros/campos da execução.
                                                    P_QTDLINHAS NUMBER, -- Informa a quantidade de registros selecionados no momento da execução.
                                                    P_MENSAGEM  OUT VARCHAR2 -- Caso seja passada uma mensagem aqui, ela será exibida como uma informação ao usuário.
                                                    ) AS
  PARAM_DATACALC DATE;
  FIELD_SEQ      NUMBER;
  V_TITULO       VARCHAR2(4000);
  V_MENSAGEM     VARCHAR2(4000);
  V_INCLUIR      BOOLEAN;
  P_INSERIU      INT := 0;
  
  
    P_TITCONTEST   VARCHAR2(4000);
    P_CONTADOR NUMBER := 1;
    P_LISCONTEST VARCHAR2(4000);
    P_QTD NUMBER;
    P_SUPERFICIE VARCHAR2(4000);
    P_CONTROLE VARCHAR2(4000);
    P_ID NUMBER;
    P_COUNTCODPROD NUMBER;
    P_PROTSUP VARCHAR2(100);
    
    PRAGMA AUTONOMOUS_TRANSACTION;  

BEGIN

  PARAM_DATACALC := ACT_DTA_PARAM(P_IDSESSAO, 'DATACALC');

  FOR I IN 1 .. P_QTDLINHAS -- Este loop permite obter o valor de campos dos registros envolvidos na execução.
   LOOP
  
    FIELD_SEQ := ACT_INT_FIELD(P_IDSESSAO, I, 'SEQ');
  
    --mensagem para confirmação do usuário
    V_TITULO   := 'ATENÇÃO';
    V_MENSAGEM := 'Deseja realmente gravar os custos na rotina padrão do sistema?';
    --V_INCLUIR  := ACT_ESCOLHER_SIMNAO(V_TITULO, V_MENSAGEM, P_IDSESSAO, I) = 'S';
    V_INCLUIR := ACT_CONFIRMAR(V_TITULO, V_MENSAGEM, P_IDSESSAO, I);
  
    --caso confirme a atualização
    IF V_INCLUIR THEN
    
      FOR R IN (SELECT V.CODPROD, V.CUSTOTAL
                  FROM AD_VALCUSTO V
                 WHERE V.DTATUAL = PARAM_DATACALC
                   AND V.CUSTOTAL > 0) LOOP
      
        --Busca no cadastro do produto se tem controle adicional, caso não tenha retorna NENHUMA
        SELECT NVL(TITCONTEST, 'NADA'), NVL(AD_PROTSUP, 'NADA')
        INTO P_TITCONTEST, P_PROTSUP
        FROM TGFPRO
        WHERE CODPROD = R.CODPROD;
      
        --Sem controle adicional
        IF P_TITCONTEST = 'NADA' THEN 
      
            /*INSERT INTO TGFCUS
              (CODPROD,
               CODEMP,
               DTATUAL,
               CUSREP,
               CUSGER,
               ENTRADACOMICMS,
               AUTOMATICO)
            VALUES
              (R.CODPROD,
               1,
               TRUNC(SYSDATE),
               R.CUSTOTAL,
               R.CUSTOTAL,
               R.CUSTOTAL,
               'N');*/
               
               SELECT NVL(MAX(ID), 0) + 1 INTO P_ID FROM AD_TESTECUSTO;
               
               INSERT INTO AD_TESTECUSTO
                (ID,
                CODPROD,
                CONTROLE,
                CUSTO)
                VALUES
                (P_ID,
                R.CODPROD,
                ' ',
                5.75);
                
                COMMIT; 
             
        
        --Tem controle adicional   
        ELSE
        
            IF P_PROTSUP = 'NENHUMA' THEN
            
                SELECT NVL(MAX(ID), 0) + 1 INTO P_ID FROM AD_TESTECUSTO;
            
                INSERT INTO AD_TESTECUSTO
                (ID,
                CODPROD,
                CONTROLE,
                CUSTO)
                VALUES
                (P_ID,
                R.CODPROD,
                'NU',
                5.75);
                
                COMMIT;  
            
            ELSE
            
        
                --Loop para pegar a lista de cores do produto
                FOR C IN 1..70 LOOP
             
                    SELECT REGEXP_SUBSTR(LISCONTEST || CHR(10), '(\\S*)(\\s)', 1, C), --SELECIONA A PALAVRA DE ACORDO COM A POSIÇÃO EX.: 1º PALAVRA
                    LENGTH (REGEXP_SUBSTR(LISCONTEST || CHR(10), '(\\S*)(\\s)', 1, C)) --RETORNA A QUANTIDADE DE CARACTERES NA PALAVRA SELECIONADA ACIMA
                    INTO P_SUPERFICIE, P_QTD
                    FROM TGFPRO 
                    WHERE CODPROD = R.CODPROD;
                    --Obs.: Como a última cor não estava sendo inserida devido não ter quebra de linha, fiz essa contatenação acrescentand no final a quebra de linha.
                    
                    --Se palavra selecionada não for vazia
                    IF P_SUPERFICIE IS NOT NULL THEN
                    
                        --Verifica se o último caractere é quebra de linha
                        IF SUBSTR(P_SUPERFICIE, P_QTD,1) = chr(10)  THEN
                            
                            --Controle recebe ele mesmo + superficie
                            P_CONTROLE := P_CONTROLE || P_SUPERFICIE; 
                            
                            --Busca o último registro na tabela    
                            SELECT NVL(MAX(ID), 0) + 1 INTO P_ID FROM AD_TESTECUSTO;
                            
                            --Inseri na tabela teste    
                            INSERT INTO AD_TESTECUSTO
                                (ID,
                                CODPROD,
                                CONTROLE,
                                CUSTO)
                            VALUES
                                (P_ID,
                                R.CODPROD,
                                P_CONTROLE,
                                5.75); 
                                
                            COMMIT;
                            
                            --Limpo o parametro controle        
                            P_CONTROLE := NULL;              
                          
                        ELSE
                               
                            --controle recebe ele mesmo + superficie 
                            P_CONTROLE := P_CONTROLE || P_SUPERFICIE;
                                                
                        END IF;
                        
                    END IF;

                END LOOP;
                
            END IF;
                
        END IF;
      
        P_INSERIU := P_INSERIU + 1;

      END LOOP;
 
    END IF;
  
  END LOOP;
  


  IF P_INSERIU > 0 THEN
  
    P_MENSAGEM := 'Foram inseridos ' || P_INSERIU ||
                  ' registros de custos no sistema!';
  
  ELSE
  
    P_MENSAGEM := 'Nenhum custo atualizado no sistema';
  
  END IF;

END;
/
Responder

Gostei + 0

05/10/2016

Roberto Spernega

Ulysses,

Este tipo de erro ocorre normalmente por timeout.

Pode estar ocorrendo algum LOCK de alguma tabela que esta sendo tratada?

Você precisa mesmo usar PRAGMA AUTONOMOUS_TRANSACTION?

Pode ser que o USER que está executando a PROCEDURE esteja lockando alguma tabela quando começa a executar e durante a execução, com o AUTONOMOUS_TRANSACTION, esta execução entra em LOCK.

Durante o seu teste, quando estiver executando, abra uma outra sessão e execute um SELECT na V$LOCK.

select Sid, To_Char(id1) Objeto,
l.Ctime ,
decode(l.type, 'MR', 'Media Reco', 'RT', 'Redo Thred','UN', 'User Name',
'TX', 'Trans','TM', 'DML','UL', 'PL/SQL Usr','DX', 'Dist. Tran',
'CF', 'Cntrl File','IS', 'Inst State','FS', 'File Set','IR', 'Inst Reco',
'ST', 'Disk Space', 'TS', 'Temp Seg', 'IV', 'Cache Inv',
'LS', 'Log Switch','RW', 'Row Wait', 'SQ', 'Seq Number',
'TE', 'Extend Tbl','TT', 'Temp Table', l.type) locktype,
decode(lmode,1,NULL,2,'Row Share',3,'Row Excl',4,'Share',
5,'Sh Row Ex',6,'Exclusive',NULL) held,
decode(request,1,NULL,2,'Row Share',3,'Row Excl',4,'Share',
5,'Sh Row Ex',6,'Exclusive',NULL) request
from v$lock l
order by l.Ctime desc;
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar