Fórum Erro: ORA-01013 Usuário solicitou cancelamento da operação atual #563574
04/10/2016
0
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
Curtir tópico
+ 0Posts
05/10/2016
Roberto Spernega
Melhor você postar a PROCEDURE.
Fica mais fácil de achar uma solução.
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;
/Gostei + 0
05/10/2016
Roberto Spernega
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;
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)