usineiro 0 Denunciar post Postado Maio 27, 2010 To tentando fazer com que após eu inserir um novo registro em uma determinada tabela, um campo desta tabela, (que o usuario não vai inserir e sim o banco fará automaticamente) seja atualizado com o mesmo valor que consta na outra tabela. Trigger: CREATE OR REPLACE TRIGGER ATUAL_QUANTOTAL_AUT AFTER INSERT ON SAIDAS FOR EACH ROW BEGIN UPDATE (SELECT S.QUANTTOTAL, P.QUANT FROM SAIDAS S INNER JOIN PRODUTOS P ON :NEW.NE = P.NE ) T SET T.QUANTTOTAL = T.QUANT; END; A trigger é criada, é dada como valida, porém quando eu tento fazer um insert simples nessa tabela de saidas, o BD retorna o seguinte erro: "ORA-06502: PL/SQL: erro: buffer de string de caracteres pequeno demais numérico ou de valor" Sem a trigger eu consigo inserir normalmente. Só pra constar os campos q to tentando passar de um para o outro são iguais, de mesmo tamanho. Alguem saberia me ajudar? Obrigado Compartilhar este post Link para o post Compartilhar em outros sites
Motta 645 Denunciar post Postado Maio 27, 2010 Não se faz update cruzado no Oracle. Uma solução: CREATE OR REPLACE TRIGGER ATUAL_QUANTOTAL_AUT AFTER INSERT ON SAIDAS FOR EACH ROW IS VN_QUANTTOTAL SAIDAS.QUANTTOTAL%TYPE; VN_QUANT PRODUTOS.quant%type; BEGIN SELECT S.QUANTTOTAL, P.QUANT, FROM SAIDAS S INNER JOIN PRODUTOS P ON :NEW.NE = P.NE; UPDATE PRODUTOS SET QUANT = VN_QUANT WHERE NE=:NEW.NE; END; Compartilhar este post Link para o post Compartilhar em outros sites
usineiro 0 Denunciar post Postado Maio 27, 2010 Pois é, eu tinha achado essa especificação de update em algum lugar, vi que é diferente mesmo para fazer isso no oracle. Porém não consegui executar essa sua solução, ele da erro: "ORA-04079: especificação de gatilho inválida" Desculpa mas não entendi essa parte do código: IS VN_QUANTTOTAL SAIDAS.QUANTTOTAL%TYPE; VN_QUANT PRODUTOS.quant%type; talvez tenha dado erro pq eu não alterei alguma coisa q você deu como obvia nessa parte do código. no update seria: UPDATE SAIDAS (tabela a ser atualizada) SET QUANTTOTAL = VN_QUANT (valor total q consta na tabela de produtos) WHERE NE (do produto) =:NEW.NE (da tabela de saidas); já arrumei isso mas tbm não resolveu Compartilhar este post Link para o post Compartilhar em outros sites
Motta 645 Denunciar post Postado Maio 27, 2010 VN_QUANTTOTAL SAIDAS.QUANTTOTAL%TYPE;--cria uma variável do mesmo tipo da coluna QUANTTOTAL de SAIDAS ... arrumei isso mas tbm não resolveu ... Qual a zebra ? Compartilhar este post Link para o post Compartilhar em outros sites
usineiro 0 Denunciar post Postado Maio 27, 2010 Eu tinha arrumado a tua parte do código pq ali no update, você tava atualizando a quant na tabela de produtos e eu quero atualizar a quant da tabela de saidas (quanttotal), quero que o registro novo q eu inserir puxe o valor que esta na tabela de produtos de um tal produto q foi inserido na tabela de saidas. Ex: Tabela produtos | Tabela saidas NE Produto Quant | NE QUANTTOTAL QUANTUSADA 1 Borracha 2 | 1 2 1 Quero que aquele 2 q esta em quattotal da tabela de saidas vá automaticamente para la assim q for inserida uma nova saida. Essa quanttotal ali em saidas, é a quantidade total que o produto tinha até ter gerada uma nova saidas desse produto To tentando criar exatamente assim: CREATE OR REPLACE TRIGGER ATUAL_QUANTOTAL_AUT AFTER INSERT ON SAIDAS FOR EACH ROW IS VN_QUANTTOTAL SAIDAS.QUANTTOTAL%TYPE; VN_QUANT PRODUTOS.quant%type; BEGIN SELECT S.QUANTTOTAL, P.QUANT, FROM SAIDAS S INNER JOIN PRODUTOS P ON :NEW.NE = P.NE; UPDATE SAIDAS SET QUANTTOTAL = VN_QUANT WHERE NE=:NEW.NE; END; ta dando o seguinte: ORA-04079: especificação de gatilho inválida Acho que ta dando o erro nessa parte: IS VN_QUANTTOTAL SAIDAS.QUANTTOTAL%TYPE; VN_QUANT PRODUTOS.quant%type; Compartilhar este post Link para o post Compartilhar em outros sites
Motta 645 Denunciar post Postado Maio 27, 2010 CREATE OR REPLACE TRIGGER ATUAL_QUANTOTAL_AUT AFTER INSERT ON SAIDAS FOR EACH ROW IS VN_QUANTTOTAL SAIDAS.QUANTTOTAL%TYPE; VN_QUANT PRODUTOS.quant%type; BEGIN SELECT S.QUANTTOTAL, P.QUANT, INTO VN_QUANTTOTAL , VN_QUANT FROM SAIDAS S INNER JOIN PRODUTOS P ON :NEW.NE = P.NE; UPDATE SAIDAS SET QUANTTOTAL = VN_QUANT WHERE NE=:NEW.NE; END; Compartilhar este post Link para o post Compartilhar em outros sites
usineiro 0 Denunciar post Postado Maio 27, 2010 Pior é que ta dando erro ainda, mesmo erro de antes. Compartilhar este post Link para o post Compartilhar em outros sites
Motta 645 Denunciar post Postado Maio 27, 2010 CREATE OR REPLACE TRIGGER ATUAL_QUANTOTAL_AUT AFTER INSERT ON SAIDAS FOR EACH ROW DECLARE VN_QUANTTOTAL SAIDAS.QUANTTOTAL%TYPE; VN_QUANT PRODUTOS.quant%type; BEGIN SELECT S.QUANTTOTAL, P.QUANT, INTO VN_QUANTTOTAL , VN_QUANT FROM SAIDAS S INNER JOIN PRODUTOS P ON :NEW.NE = P.NE; UPDATE SAIDAS SET QUANTTOTAL = VN_QUANT WHERE NE=:NEW.NE; END; --- Este SELECT porém só pode retornar uma linha, zero linhas ou mais de uma dará erro na execução. --- Compartilhar este post Link para o post Compartilhar em outros sites
usineiro 0 Denunciar post Postado Maio 27, 2010 beleza, a trigger foi aceita pelo BD, só que quando eu vou inserir um registro na tabela de saidas pra fazer o teste, ele da o mesmo erro q tava dnado com o update que eu fazia q ta no 1º post. Ele não deixa adicionar o registro dando esse erro: erro: "ORA-06502: PL/SQL: erro: buffer de string de caracteres pequeno demais numérico ou de valor" Compartilhar este post Link para o post Compartilhar em outros sites
Motta 645 Denunciar post Postado Maio 27, 2010 Na realidade não é update pois é o mesmo registro CREATE OR REPLACE TRIGGER ATUAL_QUANTOTAL_AUT AFTER INSERT ON SAIDAS FOR EACH ROW DECLARE VN_QUANTTOTAL SAIDAS.QUANTTOTAL%TYPE; VN_QUANT PRODUTOS.quant%type; BEGIN SELECT S.QUANTTOTAL, P.QUANT, INTO VN_QUANTTOTAL , VN_QUANT FROM SAIDAS S INNER JOIN PRODUTOS P ON :NEW.NE = P.NE; :NEW.QUANTTOTAL := VN_QUANT; END; Compartilhar este post Link para o post Compartilhar em outros sites
caduribeiro13 0 Denunciar post Postado Maio 28, 2010 esta trigger ficará mutante, pois está definida sobre a tabela SAIDAS, e faz select nela mesma. Compartilhar este post Link para o post Compartilhar em outros sites
Motta 645 Denunciar post Postado Maio 28, 2010 Não no INSERT, creio. Compartilhar este post Link para o post Compartilhar em outros sites
caduribeiro13 0 Denunciar post Postado Maio 28, 2010 você está certo Motta, fiz um teste aqui. Aprendi mais uma hoje. Só precisei mudar a trigger para BEFORE INSERT, pois não compilava. Obrigado, abraços. Compartilhar este post Link para o post Compartilhar em outros sites
usineiro 0 Denunciar post Postado Maio 28, 2010 Tbm precisei mudar pra BEFORE INSERT pra compilar aqui, só que ta dando o mesmo problema ainda. Na hora que eu vou inserir um registro em "SAIDAS" ele me retorna aquele erro de Buffer de String que tava dando nas outras vezes que eu falei. Não sei pq não aceitou com AFTER INSERT, seria o mais certo pra mim, pois o campo QUANTTOTAL da minha tabela de saidas não esta definido como obrigatório, portanto a idéia é depois que o usuario registrar que teve uma saida de um produto, ele informar apenas a quantusada e essa trigger se encarregaria por atualizar a QUANTTOTAL automaticamente dessa nova saida no caso, depois que o registro estivesse na tabela. Se vcs souberem alguma outra solução ou até mesmo fzendo com que essa aceite eu agradeço Compartilhar este post Link para o post Compartilhar em outros sites
Motta 645 Denunciar post Postado Maio 28, 2010 Tente rodar a query "por fora" e veja o que ela retorna. Compartilhar este post Link para o post Compartilhar em outros sites
usineiro 0 Denunciar post Postado Maio 28, 2010 Pra atualizar do jeito que eu quero nao consigo fazer nem rodando em separado. Testei aqui inserir um registro na tabela de saidas (sem o valor de QUANTTOTAL), sem o trigger como eu disse ele funciona ok, dai depois tentei setar a quanttotal com o valor QUANT do produto da tabela de produtos, mais da erro tbm. Ta dando esse mesmo erro de buffer ai. Que que será que ta dando? Compartilhar este post Link para o post Compartilhar em outros sites
Motta 645 Denunciar post Postado Maio 28, 2010 Rode a query SELECT S.QUANTTOTAL, P.QUANT FROM SAIDAS S INNER JOIN PRODUTOS P ON :NEW.NE = P.NE Substituindo :NEW.NE pelo valor que seria inserido e veja o resultado. Compartilhar este post Link para o post Compartilhar em outros sites
usineiro 0 Denunciar post Postado Maio 28, 2010 Essa tua consulta me resultou todos os registros da tabela de saidas com a quant do produto que eu especifiquei o NE ex: SELECT S.QUANTTOTAL, P.QUANT FROM SAIDAS S INNER JOIN PRODUTOS P ON P.NE = 67298 Eu quero apenas atualizar o dado inserido (que seria esse NE por exemplo), mais que apenas esse NE contenha a quant igual a da tabela de produtos e não todos os registro que é como ta acontecendo.. ai eu fiz assim pra testar: SELECT S.QUANTTOTAL, P.QUANT FROM SAIDAS S INNER JOIN PRODUTOS P ON P.NE = S.NE and S.NE = 67298 beleza deu certo, ate consegui passar isso pra update, atualizei esse registro que queria e tal, ficou assim: UPDATE (SELECT S.QUANTTOTAL, P.QUANT FROM SAIDAS S, PRODUTOS P WHERE S.NE = P.NE AND S.NE=67298 ) T SET T.QUANTTOTAL = T.QUANT Funciou perfeitamente se eu adiciono um registro antes e depois rodo essa consulta, ele altera apenas o registro que eu quero com o valor da quant da outra tabela. O problema é quando eu passo isso pra trigger, a trigger é valida e tudo mais, so que quando eu do insert pra testar ele da o maldito erro de buffer aquele. A trigger ficou assim: CREATE OR REPLACE TRIGGER ATUAL_QUANTOTAL_AUT AFTER INSERT ON SAIDAS FOR EACH ROW BEGIN UPDATE (SELECT S.QUANTTOTAL, P.QUANT FROM SAIDAS S, PRODUTOS P WHERE S.NE = P.NE AND S.NE=:NEW.NE ) T SET T.QUANTTOTAL = T.QUANT; END; Tentei assim tbm e deu o mesmo erro: CREATE OR REPLACE TRIGGER ATUAL_QUANTOTAL_AUT AFTER INSERT ON SAIDAS FOR EACH ROW DECLARE VN_QUANTTOTAL SAIDAS.QUANTTOTAL%TYPE; VN_QUANT PRODUTOS.QUANT%TYPE; BEGIN SELECT S.QUANTTOTAL, P.QUANT INTO VN_QUANTTOTAL , VN_QUANT FROM SAIDAS S INNER JOIN PRODUTOS P ON S.NE = P.NE AND S.NE = :NEW.NE; VN_QUANTTOTAL := VN_QUANT; END; Resumindo, "por fora" eu consegui fazer rodar, na trigger não ta funcionando não sei pq Compartilhar este post Link para o post Compartilhar em outros sites
Motta 645 Denunciar post Postado Maio 28, 2010 O que você quis dizer com ... Essa tua consulta me resultou todos os registros da tabela de saidas com a quant do produto que eu especifiquei o NE ...? A query retorna mais de uma linha ? Retorna o valor correto ? tente assim : CREATE OR REPLACE TRIGGER ATUAL_QUANTOTAL_AUT BEFORE INSERT ON SAIDAS -- <<< FOR EACH ROW DECLARE VN_QUANTTOTAL SAIDAS.QUANTTOTAL%TYPE; VN_QUANT PRODUTOS.QUANT%TYPE; BEGIN SELECT S.QUANTTOTAL, P.QUANT INTO VN_QUANTTOTAL , VN_QUANT FROM SAIDAS S INNER JOIN PRODUTOS P ON S.NE = P.NE AND S.NE = :NEW.NE; -- :NEW.QUANTTOTAL := VN_QUANT; -- <<<< END; Compartilhar este post Link para o post Compartilhar em outros sites
usineiro 0 Denunciar post Postado Maio 28, 2010 Eu quis dizer que naquela sua consulta, se eu tenho 3 registros em saidas, ele me retorna os 3 (inclusive o valor que eu quero) e poe o valor total igual ao do NE que eu passei da tabela de produtos. Na que eu fiz ali em seguida, eu consegui o resultado que eu queria, apenas o registro que de tal NE da tabela de saidas (apenas 1 registro) que é igual ao NE da tabela de produtos, e a quanttotal dele ficou igual ao da outra tabela. O problema que na trigger nao ta indo. Essa trigger q você postou agora tbm não funciou, acontece sempre o mesmo problema. A trigger fica valida mais na hora de inserir um registro pra testa da o mesmo problema de sempre só pra constar.. meu insert ta sendo assim: INSERT INTO SAIDAS (CODIGO, NE, DATA, QUANTUSA, USUARIO) VALUES (3,67298,'10/02/2010', 20, 'teste'); só não estou passando a coluna QUANTTOTAL, pq justamente essa é para a trigger add o valor. OBS: Mesmo eu inserindo algo qualquer em QUANTTOTAL ali, esperando que a trigger sobreponha o valor no caso, não funciona Compartilhar este post Link para o post Compartilhar em outros sites