- Este tópico contém 16 respostas, 4 vozes e foi atualizado pela última vez 16 anos, 2 meses atrás por
vieira.
-
AutorPosts
-
5 de outubro de 2009 às 11:05 pm #90114
vieira
ParticipantePessoal, estou executando uma trigger mas quando faço o update aparece o seguinte erro
ORA-06502: PL/SQL: numeric or value error: character string buffer too small
essa eh a minha declaração das variáveis….
CREATE OR REPLACE TRIGGER tgr_GeraCodServico
BEFORE INSERT OR UPDATE
ON CADMAT
REFERENCING NEW AS novo_campo
FOR EACH ROW
DECLARE
Pragma Autonomous_Transaction;
V_COD_CADMAT CHAR(12);
V_DESCR_TABCAR CHAR(40);
V_COD_ICMS CHAR(20);
V_NEW_VALUE CHAR(2);e este é o update a ser realizado
update cadmat set descr_mat_cadmat = ‘teste de trigger’ where cod_mat_cadmat = ‘00246’;
o erro aparece na declaração desta variável V_COD_CADMAT CHAR(12); …. já tentei colocar varchar2, char de(40) e não funciona… se alguem puder me ajudar ficaria muito grato
Atenciosamente
Lucas Alves6 de outubro de 2009 às 12:12 am #90116Leonardo Litz
ParticipanteOlá Lucas,
Tente utilizar a tipagem desta variavel por herança, V_COD_CADMAT%CADMAT.cod_mat_cadmat%TYPE.
Oque mais esta trigger faz?
Vlw Leonardo Litz
6 de outubro de 2009 às 12:19 am #90117vieira
ParticipanteOlá leonardo, obrigado pela atenção….
Eu já tinha testado também oque você falow ^^ hahaa, mas também nao funcionou, não se se ajuda mas vou postar a trigger toda abaixo
CREATE OR REPLACE TRIGGER tgr_GeraCodServico
BEFORE INSERT OR UPDATE
ON CADMAT
REFERENCING NEW AS novo_campo
FOR EACH ROW
DECLARE
Pragma Autonomous_Transaction;V_COD_CADMAT CADMAT.cod_mat_cadmat%TYPE;
V_DESCR_TABCAR CHAR(40);
V_COD_ICMS CHAR(20);
V_NEW_VALUE CHAR(2);BEGIN
SELECT COD_MAT_CADMAT INTO V_COD_CADMAT FROM CADMAT WHERE COD_MAT_CADMAT = :novo_campo.COD_MAT_CADMAT;
SELECT DESCR_MAT_CADMAT INTO V_DESCR_TABCAR FROM CADMAT WHERE COD_MAT_CADMAT = :novo_campo.COD_MAT_CADMAT;
SELECT COD_ICMS_RET_CADMAT INTO V_COD_ICMS FROM CADMAT WHERE COD_MAT_CADMAT = V_COD_CADMAT;
SELECT CASE
WHEN MAX( ASCII(SUBSTR (COD_TABCAR,0,2))) = 33 AND (MAX( ASCII(SUBSTR (COD_TABCAR,2,3)))) = 125 THEN CHR(MAX( ASCII(SUBSTR (COD_TABCAR,0,2))) + 2 ) || CHR ( MAX(ASCII(SUBSTR (COD_TABCAR,2,3))))
WHEN MAX( ASCII(SUBSTR (COD_TABCAR,0,2))) = 33 AND MAX( ASCII(SUBSTR (COD_TABCAR,2,3))) = 35 AND MAX( ASCII(SUBSTR (COD_TABCAR,0,2))) = 35 AND MAX( ASCII(SUBSTR (COD_TABCAR,0,2))) < 38 AND MAX( ASCII(SUBSTR (COD_TABCAR,2,3))) < 125 THEN CHR(MAX( ASCII(SUBSTR (COD_TABCAR,0,2)))) || CHR(MAX( ASCII(SUBSTR (COD_TABCAR,2,3)) + 1))WHEN MAX( ASCII(SUBSTR (COD_TABCAR,0,2))) = 38 AND MAX( ASCII(SUBSTR (COD_TABCAR,2,3))) = 125 THEN CHR(MAX( ASCII(SUBSTR (COD_TABCAR,0,2)))) || CHR(MAX( ASCII(SUBSTR (COD_TABCAR,0,2))) + 2) WHEN MAX( ASCII(SUBSTR (COD_TABCAR,0,2))) = 38 AND MAX( ASCII(SUBSTR (COD_TABCAR,2,3))) = 40 AND MAX( ASCII(SUBSTR (COD_TABCAR,0,2))) = 40 AND MAX( ASCII(SUBSTR (COD_TABCAR,0,2))) < 93 AND MAX( ASCII(SUBSTR (COD_TABCAR,2,3))) = 40 AND MAX( ASCII(SUBSTR (COD_TABCAR,0,2))) = 93 AND MAX( ASCII(SUBSTR (COD_TABCAR,2,3))) = 125 THEN CHR(MAX( ASCII(SUBSTR (COD_TABCAR,0,2))) + 2) || CHR(MAX( ASCII(SUBSTR (COD_TABCAR,2,3)))) WHEN MAX( ASCII(SUBSTR (COD_TABCAR,0,2))) >= 40 AND MAX( ASCII(SUBSTR (COD_TABCAR,0,2))) < 93 AND MAX( ASCII(SUBSTR (COD_TABCAR,2,3))) < 125 THEN CHR(MAX( ASCII(SUBSTR (COD_TABCAR,0,2)))) || CHR(MAX(ASCII(SUBSTR (COD_TABCAR,2,3))) + 1) WHEN MAX( ASCII(SUBSTR (COD_TABCAR,0,2))) = 95 AND MAX( ASCII(SUBSTR (COD_TABCAR,2,3))) = 125 THEN CHR(MAX( ASCII(SUBSTR (COD_TABCAR,0,2))) + 2 ) || CHR(MAX( ASCII(SUBSTR (COD_TABCAR,2,3)))) WHEN MAX( ASCII(SUBSTR (COD_TABCAR,0,2))) = 95 AND MAX( ASCII(SUBSTR (COD_TABCAR,2,3))) = 97 AND MAX(ASCII(SUBSTR (COD_TABCAR,0,2))) = 97 AND MAX(ASCII(SUBSTR (COD_TABCAR,0,2))) < 125 AND MAX(ASCII(SUBSTR(COD_TABCAR,2,3))) < 125 THEN CHR(MAX(ASCII(SUBSTR(COD_TABCAR,0,2)))) || CHR(MAX(ASCII(SUBSTR (COD_TABCAR,2,3))) + 1) END COD_TABCAR INTO V_NEW_VALUE FROM TABCAR;IF V_COD_ICMS = ' ' THEN
INSERT INTO TABCAR VALUES(V_NEW_VALUE , V_DESCR_TABCAR); UPDATE CADMAT SET COD_ICMS_RET_CADMAT = V_NEW_VALUE WHERE COD_MAT_CADMAT = V_COD_CADMAT;END IF ;
commit;
END tgr_GeraCodServico;Deixa eu explicar mais ou menos a Trigger:
Objetivo: verificar qual o ultimo item existente na TABCAR, e adicionar mais um, de acordo com a tabela ASCII lá ….Grato desde já
Lucas6 de outubro de 2009 às 12:42 am #90118Leonardo Litz
ParticipanteOlá Lucas,
Verifique a tipagem da segunda coluna da tabela TABCAR, veja se esta igual a coluna DESCR_MAT_CADMAT da tabela CADMAT.
Fiz algumas modificações em sua trigger:
CREATE OR REPLACE TRIGGER tgr_GeraCodServicoBEFORE INSERT OR UPDATE
ON CADMAT
REFERENCING NEW AS novo_campo
FOR EACH ROW
DECLARE
Pragma Autonomous_Transaction;V_COD_CADMAT CADMAT.cod_mat_cadmat%TYPE;
V_DESCR_TABCAR CADMAT.DESCR_MAT_CADMAT%TYPE;
V_COD_ICMS CADMAT.COD_ICMS_RET_CADMAT%TYPE;
V_NEW_VALUE CADMAT.COD_ICMS_RET_CADMAT%TYPE;BEGIN
SELECT COD_MAT_CADMAT, DESCR_MAT_CADMAT, COD_ICMS_RET_CADMAT
INTO V_COD_CADMAT, V_DESCR_TABCAR, V_COD_ICMS
FROM CADMAT
WHERE COD_MAT_CADMAT = :novo_campo.COD_MAT_CADMAT;/*SELECT DESCR_MAT_CADMAT INTO V_DESCR_TABCAR FROM CADMAT WHERE COD_MAT_CADMAT = :novo_campo.COD_MAT_CADMAT;
SELECT COD_ICMS_RET_CADMAT INTO V_COD_ICMS FROM CADMAT WHERE COD_MAT_CADMAT = V_COD_CADMAT; */
SELECT CASE
WHEN MAX( ASCII(SUBSTR (COD_TABCAR,0,2))) = 33 AND (MAX( ASCII(SUBSTR (COD_TABCAR,2,3)))) = 125 THEN CHR(MAX( ASCII(SUBSTR (COD_TABCAR,0,2))) + 2 ) || CHR ( MAX(ASCII(SUBSTR (COD_TABCAR,2,3))))
WHEN MAX( ASCII(SUBSTR (COD_TABCAR,0,2))) = 33 AND MAX( ASCII(SUBSTR (COD_TABCAR,2,3))) = 35 AND MAX( ASCII(SUBSTR (COD_TABCAR,0,2))) = 35 AND MAX( ASCII(SUBSTR (COD_TABCAR,0,2))) < 38 AND MAX( ASCII(SUBSTR (COD_TABCAR,2,3))) < 125 THEN CHR(MAX( ASCII(SUBSTR (COD_TABCAR,0,2)))) || CHR(MAX( ASCII(SUBSTR (COD_TABCAR,2,3)) + 1))WHEN MAX( ASCII(SUBSTR (COD_TABCAR,0,2))) = 38 AND MAX( ASCII(SUBSTR (COD_TABCAR,2,3))) = 125 THEN CHR(MAX( ASCII(SUBSTR (COD_TABCAR,0,2)))) || CHR(MAX( ASCII(SUBSTR (COD_TABCAR,0,2))) + 2)
WHEN MAX( ASCII(SUBSTR (COD_TABCAR,0,2))) = 38 AND MAX( ASCII(SUBSTR (COD_TABCAR,2,3))) = 40 AND MAX( ASCII(SUBSTR (COD_TABCAR,0,2))) = 40 AND MAX( ASCII(SUBSTR (COD_TABCAR,0,2))) < 93 AND MAX( ASCII(SUBSTR (COD_TABCAR,2,3))) = 40 AND MAX( ASCII(SUBSTR (COD_TABCAR,0,2))) = 93 AND MAX( ASCII(SUBSTR (COD_TABCAR,2,3))) = 125 THEN CHR(MAX( ASCII(SUBSTR (COD_TABCAR,0,2))) + 2) || CHR(MAX( ASCII(SUBSTR (COD_TABCAR,2,3))))
WHEN MAX( ASCII(SUBSTR (COD_TABCAR,0,2))) >= 40 AND MAX( ASCII(SUBSTR (COD_TABCAR,0,2))) < 93 AND MAX( ASCII(SUBSTR (COD_TABCAR,2,3))) < 125 THEN CHR(MAX( ASCII(SUBSTR (COD_TABCAR,0,2)))) || CHR(MAX(ASCII(SUBSTR (COD_TABCAR,2,3))) + 1)WHEN MAX( ASCII(SUBSTR (COD_TABCAR,0,2))) = 95 AND MAX( ASCII(SUBSTR (COD_TABCAR,2,3))) = 125 THEN CHR(MAX( ASCII(SUBSTR (COD_TABCAR,0,2))) + 2 ) || CHR(MAX( ASCII(SUBSTR (COD_TABCAR,2,3))))
WHEN MAX( ASCII(SUBSTR (COD_TABCAR,0,2))) = 95 AND MAX( ASCII(SUBSTR (COD_TABCAR,2,3))) = 97 AND MAX(ASCII(SUBSTR (COD_TABCAR,0,2))) = 97 AND MAX(ASCII(SUBSTR (COD_TABCAR,0,2))) < 125 AND MAX(ASCII(SUBSTR(COD_TABCAR,2,3))) < 125 THEN CHR(MAX(ASCII(SUBSTR(COD_TABCAR,0,2)))) || CHR(MAX(ASCII(SUBSTR (COD_TABCAR,2,3))) + 1)
END COD_TABCAR INTO V_NEW_VALUE FROM TABCAR;IF V_COD_ICMS = ' ' THEN
INSERT INTO TABCAR VALUES(V_NEW_VALUE , V_DESCR_TABCAR);
UPDATE CADMAT SET COD_ICMS_RET_CADMAT = V_NEW_VALUE WHERE COD_MAT_CADMAT = V_COD_CADMAT;
END IF ;
commit;
END tgr_GeraCodServico;
6 de outubro de 2009 às 12:49 am #90119vieira
ParticipanteFiz a troca leonardo, a única variável que não da para pegar por herança eh a V_DESCR_TABCAR porque na tab car a descr_tabcar é char(40) e a descr_mat_cadmat é char(80) então eu tenho que limitar o tamanho dela……
Oque ocorreu agora é, apareceu o mesmo erro, mas agora sempre dá o erro na linha 12….. independente se eu começar a trigger na linha 50, da erro na linha 12..achei mto estranho……abaixo o erro…
ORA-06502: PL/SQL: numeric or value error: character string buffer too small
ORA-06512: at “EFOOD_APETECE.TGR_GERACODSERVICO”, line 12
ORA-04088: error during execution of trigger ‘EFOOD_APETECE.TGR_GERACODSERVICO’Grato…Leonardo eu te adicionei no msn, se possível me aceita lá, eu estou indo para casa as 18h…. no msn eh mais fácil de conversarmos…
Abraços
6 de outubro de 2009 às 1:00 am #90120Leonardo Litz
ParticipanteO pior que aqui não tenho msn… só anoite.. depois das 23h…
Acho que pode ser isso:
a única variável que não da para pegar por herança eh a V_DESCR_TABCAR porque na tab car a descr_tabcar é char(40) e a descr_mat_cadmat é char(80) então eu tenho que limitar o tamanho delaSe a tabela que esta recebendo as informações (insert lá embaixo) é menor que a tabela que esta fornecedo irá ocorrer este erro.
Para testar coloque um substr(V_DESCR_TABCAR,1,40) no insert.
Como vc mesmo disse, a V_DESCR_TABCAR não pode ser herdada, ela esta recebendo uma informação da tabela CADMAT que contem um tamanho de 80 posicoes, qual tamanho vc declarou esta variavel? 40 ou 80?Vlw Leonardo Litz
6 de outubro de 2009 às 1:08 am #90121vieira
ParticipantePra variar deu o mesmo erro ahahah, to achando q a máquina está viciada…. Eu declarei com 40 porque a descr vai ser inserida na tabcar, e na tabcar eh char(40), como na declaração ja esta char de 40 ele pega só as primeiras 40 posições,….
Será que pode ser outra coisa que esta gerando o erro ? antes o erro que estava dando é era…
ORA-04091: table EFOOD_APETECE.CADMAT is mutating, trigger/function may not see it
ORA-06512: at "EFOOD_APETECE.TGR_GERACODSERVICO", line 13
ORA-04088: error during execution of trigger 'EFOOD_APETECE.TGR_GERACODSERVICO'
ai eu coloquei esta linha, que evita dar esse erro de mutação na tabela…
Pragma Autonomous_Transaction;
foi ai que começou a dar este erro de tamanho do campo ai….
Abaixo vou enviar minha trigger quando ainda estava dando o erro de mutação na tabela, não sei qual erro é menos difícil de resolver ^^
CREATE OR REPLACE TRIGGER tgr_GeraCodServicoBEFORE INSERT OR UPDATE
ON CADMAT
REFERENCING NEW AS novo_campo
FOR EACH ROW
DECLARE
V_NEW_VALUE CHAR(2);
V_COD_CADMAT CADMAT.COD_MAT_CADMAT%type;
V_DESCR_TABCAR CHAR(40);
V_COD_ICMS CHAR(5);BEGIN
select :novo_campo.COD_MAT_CADMAT, :novo_campo.DESCR_MAT_CADMAT into V_COD_CADMAT, V_DESCR_TABCAR from dual;
SELECT COD_ICMS_RET_CADMAT INTO V_COD_ICMS FROM CADMAT WHERE COD_MAT_CADMAT = V_COD_CADMAT;
SELECT CASE
WHEN MAX( ASCII(SUBSTR (COD_TABCAR,0,2))) = 33 AND (MAX( ASCII(SUBSTR (COD_TABCAR,2,3)))) = 125 THEN CHR(MAX( ASCII(SUBSTR (COD_TABCAR,0,2))) + 2 ) || CHR ( MAX(ASCII(SUBSTR (COD_TABCAR,2,3))))
WHEN MAX( ASCII(SUBSTR (COD_TABCAR,0,2))) = 33 AND MAX( ASCII(SUBSTR (COD_TABCAR,2,3))) = 35 AND MAX( ASCII(SUBSTR (COD_TABCAR,0,2))) = 35 AND MAX( ASCII(SUBSTR (COD_TABCAR,0,2))) < 38 AND MAX( ASCII(SUBSTR (COD_TABCAR,2,3))) < 125 THEN CHR(MAX( ASCII(SUBSTR (COD_TABCAR,0,2)))) || CHR(MAX( ASCII(SUBSTR (COD_TABCAR,2,3)) + 1))WHEN MAX( ASCII(SUBSTR (COD_TABCAR,0,2))) = 38 AND MAX( ASCII(SUBSTR (COD_TABCAR,2,3))) = 125 THEN CHR(MAX( ASCII(SUBSTR (COD_TABCAR,0,2)))) || CHR(MAX( ASCII(SUBSTR (COD_TABCAR,0,2))) + 2) WHEN MAX( ASCII(SUBSTR (COD_TABCAR,0,2))) = 38 AND MAX( ASCII(SUBSTR (COD_TABCAR,2,3))) = 40 AND MAX( ASCII(SUBSTR (COD_TABCAR,0,2))) = 40 AND MAX( ASCII(SUBSTR (COD_TABCAR,0,2))) < 93 AND MAX( ASCII(SUBSTR (COD_TABCAR,2,3))) = 40 AND MAX( ASCII(SUBSTR (COD_TABCAR,0,2))) = 93 AND MAX( ASCII(SUBSTR (COD_TABCAR,2,3))) = 125 THEN CHR(MAX( ASCII(SUBSTR (COD_TABCAR,0,2))) + 2) || CHR(MAX( ASCII(SUBSTR (COD_TABCAR,2,3)))) WHEN MAX( ASCII(SUBSTR (COD_TABCAR,0,2))) >= 40 AND MAX( ASCII(SUBSTR (COD_TABCAR,0,2))) < 93 AND MAX( ASCII(SUBSTR (COD_TABCAR,2,3))) < 125 THEN CHR(MAX( ASCII(SUBSTR (COD_TABCAR,0,2)))) || CHR(MAX(ASCII(SUBSTR (COD_TABCAR,2,3))) + 1) WHEN MAX( ASCII(SUBSTR (COD_TABCAR,0,2))) = 95 AND MAX( ASCII(SUBSTR (COD_TABCAR,2,3))) = 125 THEN CHR(MAX( ASCII(SUBSTR (COD_TABCAR,0,2))) + 2 ) || CHR(MAX( ASCII(SUBSTR (COD_TABCAR,2,3)))) WHEN MAX( ASCII(SUBSTR (COD_TABCAR,0,2))) = 95 AND MAX( ASCII(SUBSTR (COD_TABCAR,2,3))) = 97 AND MAX(ASCII(SUBSTR (COD_TABCAR,0,2))) = 97 AND MAX(ASCII(SUBSTR (COD_TABCAR,0,2))) < 125 AND MAX(ASCII(SUBSTR(COD_TABCAR,2,3))) < 125 THEN CHR(MAX(ASCII(SUBSTR(COD_TABCAR,0,2)))) || CHR(MAX(ASCII(SUBSTR (COD_TABCAR,2,3))) + 1) END COD_TABCAR INTO V_NEW_VALUE FROM TABCAR;IF V_COD_ICMS = ' ' THEN
INSERT INTO TABCAR VALUES(V_NEW_VALUE, V_DESCR_TABCAR);
UPDATE CADMAT SET COD_ICMS_RET_CADMAT = V_NEW_VALUE WHERE COD_MAT_CADMAT = V_COD_CADMAT;
END IF ;END trg_GeraCodServico;
Abraços
6 de outubro de 2009 às 1:15 am #90122Leonardo Litz
ParticipanteEntão Lucas….
Creio que seja por causa do tamanho dos campos nas tabelas que estão diferentes, para teste você não pode aumentar os dois campos de descrição para 80 posicoes (não se esqueca de herdar a tipagem da variavel V_DESCR_TABCAR )?
Vlw Leonardo Litz
6 de outubro de 2009 às 1:26 am #90123vieira
ParticipanteOPA, criei outra tabela porque aki no trampo eh embaçado mudar a estrutura da tabela, mas enfim, mudou o erro pelomenos…
ORA-00060: deadlock detected while waiting for resource
ORA-06512: at "EFOOD_APETECE.TGR_GERACODSERVICO", line 48
ORA-04088: error during execution of trigger 'EFOOD_APETECE.TGR_GERACODSERVICO'
Como estou indo embora, amanha irei procurar sobre ele no google, caso alguem saiba como me ajudar, agradeço, abaixo segue trigger atualizada ok!… Valew ai até agora …
CREATE OR REPLACE TRIGGER tgr_GeraCodServicoBEFORE INSERT OR UPDATE
ON CADMAT
REFERENCING NEW AS novo_campo
FOR EACH ROW
DECLARE
Pragma Autonomous_Transaction;V_COD_CADMAT CADMAT.cod_mat_cadmat%TYPE;
V_DESCR_TABCAR CADMAT.DESCR_MAT_CADMAT%TYPE;
V_COD_ICMS CADMAT.COD_ICMS_RET_CADMAT%TYPE;
V_NEW_VALUE CADMAT.COD_ICMS_RET_CADMAT%TYPE;BEGIN
SELECT COD_MAT_CADMAT, DESCR_MAT_CADMAT, COD_ICMS_RET_CADMAT
INTO V_COD_CADMAT, V_DESCR_TABCAR, V_COD_ICMS
FROM CADMAT
WHERE COD_MAT_CADMAT = :novo_campo.COD_MAT_CADMAT;SELECT CASE
WHEN MAX( ASCII(SUBSTR (COD_TABCAR,0,2))) = 33 AND (MAX( ASCII(SUBSTR (COD_TABCAR,2,3)))) = 125 THEN CHR(MAX( ASCII(SUBSTR (COD_TABCAR,0,2))) + 2 ) || CHR ( MAX(ASCII(SUBSTR (COD_TABCAR,2,3))))
WHEN MAX( ASCII(SUBSTR (COD_TABCAR,0,2))) = 33 AND MAX( ASCII(SUBSTR (COD_TABCAR,2,3))) = 35 AND MAX( ASCII(SUBSTR (COD_TABCAR,0,2))) = 35 AND MAX( ASCII(SUBSTR (COD_TABCAR,0,2))) < 38 AND MAX( ASCII(SUBSTR (COD_TABCAR,2,3))) < 125 THEN CHR(MAX( ASCII(SUBSTR (COD_TABCAR,0,2)))) || CHR(MAX( ASCII(SUBSTR (COD_TABCAR,2,3)) + 1))WHEN MAX( ASCII(SUBSTR (COD_TABCAR,0,2))) = 38 AND MAX( ASCII(SUBSTR (COD_TABCAR,2,3))) = 125 THEN CHR(MAX( ASCII(SUBSTR (COD_TABCAR,0,2)))) || CHR(MAX( ASCII(SUBSTR (COD_TABCAR,0,2))) + 2)
WHEN MAX( ASCII(SUBSTR (COD_TABCAR,0,2))) = 38 AND MAX( ASCII(SUBSTR (COD_TABCAR,2,3))) = 40 AND MAX( ASCII(SUBSTR (COD_TABCAR,0,2))) = 40 AND MAX( ASCII(SUBSTR (COD_TABCAR,0,2))) < 93 AND MAX( ASCII(SUBSTR (COD_TABCAR,2,3))) = 40 AND MAX( ASCII(SUBSTR (COD_TABCAR,0,2))) = 93 AND MAX( ASCII(SUBSTR (COD_TABCAR,2,3))) = 125 THEN CHR(MAX( ASCII(SUBSTR (COD_TABCAR,0,2))) + 2) || CHR(MAX( ASCII(SUBSTR (COD_TABCAR,2,3))))
WHEN MAX( ASCII(SUBSTR (COD_TABCAR,0,2))) >= 40 AND MAX( ASCII(SUBSTR (COD_TABCAR,0,2))) < 93 AND MAX( ASCII(SUBSTR (COD_TABCAR,2,3))) < 125 THEN CHR(MAX( ASCII(SUBSTR (COD_TABCAR,0,2)))) || CHR(MAX(ASCII(SUBSTR (COD_TABCAR,2,3))) + 1)WHEN MAX( ASCII(SUBSTR (COD_TABCAR,0,2))) = 95 AND MAX( ASCII(SUBSTR (COD_TABCAR,2,3))) = 125 THEN CHR(MAX( ASCII(SUBSTR (COD_TABCAR,0,2))) + 2 ) || CHR(MAX( ASCII(SUBSTR (COD_TABCAR,2,3))))
WHEN MAX( ASCII(SUBSTR (COD_TABCAR,0,2))) = 95 AND MAX( ASCII(SUBSTR (COD_TABCAR,2,3))) = 97 AND MAX(ASCII(SUBSTR (COD_TABCAR,0,2))) = 97 AND MAX(ASCII(SUBSTR (COD_TABCAR,0,2))) < 125 AND MAX(ASCII(SUBSTR(COD_TABCAR,2,3))) < 125 THEN CHR(MAX(ASCII(SUBSTR(COD_TABCAR,0,2)))) || CHR(MAX(ASCII(SUBSTR (COD_TABCAR,2,3))) + 1)
END COD_TABCAR INTO V_NEW_VALUE FROM TABCAR;IF V_COD_ICMS = ' ' THEN
INSERT INTO TABCAR_DUMMY VALUES(V_NEW_VALUE , V_DESCR_TABCAR);
UPDATE CADMAT SET COD_ICMS_RET_CADMAT = V_NEW_VALUE WHERE COD_MAT_CADMAT = V_COD_CADMAT;
END IF ;
commit;
END tgr_GeraCodServico;
6 de outubro de 2009 às 3:21 am #90124Ishii
ParticipanteOlá,
Como a declaração das variáveis segue a estrutura da tabela o erro não ocorre mais, porém o deadlock me parece ser por conta do último update na mesma tabela.
Acho que somente
:new.COD_ICMS_RET_CADMAT := V_NEW_VALUE;deveria resolver….
[]s Ishii
6 de outubro de 2009 às 3:24 pm #90126vieira
ParticipanteIshii, obrigado pela atenção!
Não consegui implementar a linha de comando que você postou, é no lugar deste update que é para por esta linha ?
UPDATE CADMAT SET COD_ICMS_RET_CADMAT = V_NEW_VALUE WHERE COD_MAT_CADMAT = V_COD_CADMAT;
Obriado a todos
Lucas Alves6 de outubro de 2009 às 9:13 pm #90136vieira
ParticipanteGalera, creio que não vá funcionar, vejam se estou certo…
A trigger é chamada quando há uma alteração na cadmat, acontece q, eu faço um update na cadmat por exemplo, a trigger é chamada, faz o select e o insert
INSERT INTO TABCAR_DUMMY VALUES(V_NEW_VALUE , V_DESCR_TABCAR);depois deste insert ela vai fazer o update:
UPDATE CADMAT SET COD_ICMS_RET_CADMAT = V_NEW_VALUE WHERE COD_MAT_CADMAT = V_COD_CADMAT;
acontece que, este update faz uma alteração na cadmat, e quando a cadmat sofre inserção ou update a trigger é chamada, ou seja, não sai do loop….
ai da esse erro de deadlockORA-00060: deadlock detected while waiting for resource
ORA-06512: at "EFOOD_APETECE.TGR_GERACODSERVICO", line 44
ORA-04088: error during execution of trigger 'EFOOD_APETECE.TGR_GERACODSERVICO'Alguem SABERIA se há alguma solução para faze-lo em uma trigger apenas ?… no SQL funciona mas porque o SQL não precisa do commit…
Atenciosamente…
6 de outubro de 2009 às 9:33 pm #90138fsitja
ParticipanteDaria, se você usasse uma de duas alternativas:
- O famoso workaround para mutating trigger.
http://asktom.oracle.com/pls/asktom/f?p … 0416059674 -
Compound Trigger (apenas em Oracle 11g).
http://www.oracle.com/technology/oramag … sktom.html
Você está usando Pragma Autonomous_Transaction de forma imprópria, pois ele não foi feito para atualizar a mesma tabela que a trigger está disparando.
Dê uma lida nos links acima, e mande suas dúvidas.
6 de outubro de 2009 às 10:01 pm #90141vieira
ParticipanteObrigado fsitja, vou dar uma olhada nos links que você postou e depois posto minhas dúvidas, obrigado até agora a todos ;….;
6 de outubro de 2009 às 10:09 pm #90142Ishii
Participante[quote=”vieira”:3psapa8u]Ishii, obrigado pela atenção!
Não consegui implementar a linha de comando que você postou, é no lugar deste update que é para por esta linha ?
UPDATE CADMAT SET COD_ICMS_RET_CADMAT = V_NEW_VALUE WHERE COD_MAT_CADMAT = V_COD_CADMAT;
Obriado a todos
Lucas Alves[/quote]Opa, desculpe-me a demora…
Sim, você teria que substituir esse comando do Update pelo
:new.COD_ICMS_RET_CADMAT := V_NEW_VALUE;Se isso não funcionou, coloque o erro para podermos analisar.
[]s Ishii
- O famoso workaround para mutating trigger.
-
AutorPosts
- Você deve fazer login para responder a este tópico.