Trigger, dado de uma tabela para outra

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
usineiro
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 4
Registrado em: Sex, 28 Mai 2010 4:48 pm
Localização: Porto Alegre

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:

Selecionar tudo

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:

Selecionar tudo

"ORA-06502: PL/SQL: erro: buffer de string de caracteres pequeno demais numérico ou de valor"
já tentei assim também mas acontece o mesmo:

Selecionar tudo

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; 

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.
alguém saberia me ajudar?

Obrigado
victorhugomuniz
Moderador
Moderador
Mensagens: 1396
Registrado em: Sex, 01 Fev 2008 2:06 pm
Localização: Rio de Janeiro - RJ
Contato:
:D

coloca a estrutura das suas tabelas ai..


acho q falta alguma conversao .. to_number.. to_char

Selecionar tudo

...

UPDATE SAIDAS SET QUANTTOTAL = to_number(VN_QUANT) WHERE NE=:NEW.NE;
...
usineiro
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 4
Registrado em: Sex, 28 Mai 2010 4:48 pm
Localização: Porto Alegre

Os dados que eu to tentando atualizar tem são do mesmo tipo, Number(6)
TAbela de Produtos:

Selecionar tudo

NE Number(10) primary key
, tipo Number(4)
, grupo Number(4)
, descricao varchar2(60)
, quant Number(6)
Tabela de Saidas

Selecionar tudo

Codigo Number(4) primary key
, NE Number (10) foreign key
, data date
, quantusa Number(6)
, usuario varchar2(30)
to pirando já com essa trigger
Avatar do usuário
fsitja
Rank: OraSauro
Rank: OraSauro
Mensagens: 611
Registrado em: Seg, 19 Jan 2009 4:29 pm
Localização: Gaúcho no Rio de Janeiro - RJ
"The scars exist to remind us that the past was real"
Campanha: Como fazer uma pergunta e obter uma resposta.
http://tkyte.blogspot.com/2005/06/how-t ... tions.html

OCA & OCP Developer — OCE SQL Expert — OCS Data Warehousing Specialist

O campo QUANTTOTAL você não postou o tipo. Além disso, tenta dar um DBMS_OUTPUT.PUT_LINE antes de executar o Update, e verifica o valor que está sendo exibido.
usineiro
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 4
Registrado em: Sex, 28 Mai 2010 4:48 pm
Localização: Porto Alegre

Esqueci de botar o QUANTTOTAL, ele esta incluso na tabela de SAIDAS, na correria esqueci de referenciar ele.
Tabela de saidas portanto fico assim:

Selecionar tudo

CODIGO Number(4) primary key
, NE Number (10) foreign key
, DATA date
, QUANTTOTAL Number(6)
, QUANTUSA Number(6)
, USUARIO varchar2(30) 
Lembrando que os campos QUANTTOTAL e QUANTUSA desta tabela NÃO são OBRIGATÓRIOS.

Assim como a QUANT da tabela de produtos não é !


Sobre o OutPut, eu tentei fazer isto ontem mais nada ocorreu, não sei se estou fazendo certo..
olha a sintaxe que eu coloquei:

Selecionar tudo

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;   --   
  VN_QUANTTOTAL := VN_QUANT; -- <<<< 
  EXCEPTION
    WHEN OTHERS THEN 
      RAISE_APPLICATION_ERROR(-20001,'VN_QUANT '||VN_QUANT||' ERRO '||substr(SQLERRM, 1, 200));
END;

Nada aconteceu, apenas compilou a Trigger e o problema no insert Persistiu
usineiro
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 4
Registrado em: Sex, 28 Mai 2010 4:48 pm
Localização: Porto Alegre

Mesmo sabendo que o erro não é de tabela mutante, tentei até criar uma view e trabalhar com ela ao invez da tabela mais não adianta, da o mesmo erro.
Sera que não tem outra maneira de resolver este problema, mas com o mesmo principio, atualizar automaticamente o campo de quantidade total da tabela de saidas com o valor de quantitade total da tabela de produtos, quando uma nova saida for lançada.
grato
Responder
  • Informação