Erro Gatilhos

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
Orlando cawende
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 4
Registrado em: Ter, 26 Jul 2016 6:41 am

So novato.Tenho duas tabelas ( itens e pedido) a qual fez um trigger que deva inserir o preço do ITEM na tabela pedido e calcular o total e inserir o total na mesma tabela

Selecionar tudo

create table ITENS(idItem number not null primary key,
preço NUMBER(8,2));

create table Pedido(idItem number not null primary key,
quantidade int,
precoUnidade number,
total number(9,2),
FOREIGN key(idItem)REFERENCES ITENS(idItem));

CREATE or replace trigger inserirPedido after insert or UPDATE of IDITEM,QUANTIDADE on Pedido
for each row
declare 
pu itens.preço%type:=0;
codigo itens.IDITEM%type;
begin 
SELECT IDITEM,preço into codigo,pu FROM ITEnS where ITENS.IDITEM=:new.IDITEM;
UPDATE pedido set precounidade=pu,total=quantidade*pu where IDITEM=codigo;
end;
/
esta a gerer o erro:

Selecionar tudo

Error(6,35): PL/SQL: ORA-00904: "TOTAL": invalid identifier
spernega
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 232
Registrado em: Ter, 19 Jun 2007 2:12 pm
Localização: São Paulo - SP

Bom dia,

Se você ainda não tiver resolvido, segue uma sugestão.

A TRIGGER precisa ser do tipo BEFORE e não AFTER.
Não faça UPDATE, atribua os valores.

Selecionar tudo

  :new.precounidade := pu;
  :new.total := (quantidade*pu);


Boa sorte!
Orlando cawende
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 4
Registrado em: Ter, 26 Jul 2016 6:41 am

tentei desta forma mais esta a gerer o erro 00201

Selecionar tudo

CREATE or replace trigger inserirPedido before insert or UPDATE of IDITEM,QUANTIDADE on Pedido
for each row
declare 
  pu ITENS.preço%type:=0;
  codigo itens.IDITEM%type;
  quant PEDIDO.QUANTIDADE%type;
begin 
  SELECT IDITEM,preço into codigo,pu FROM ITEnS where ITENS.IDITEM=:new.IDITEM;
  :new.precounidade := pu;
  :new.total := (quantidade*pu);
  insert into pedido(precoUnidade)values(:new.precounidade);
  insert into pedido(total)values (:new.total);
end;
/
spernega
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 232
Registrado em: Ter, 19 Jun 2007 2:12 pm
Localização: São Paulo - SP

Orlando,

O erro está no INSERT na PEDIDO que você está fazendo.

quando você atribuiu

Selecionar tudo

:new.precounidade := pu;
:new.total := (quantidade*pu);
os campos já estão sendo atualizados na tabela.

Experimente tirar os dois INSERTS e executar novamente.
Orlando cawende
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 4
Registrado em: Ter, 26 Jul 2016 6:41 am

Obrigado pelo apoio que tenho merecido. no entanto quando executo o gatilho deste gesto

Selecionar tudo

CREATE or replace trigger inserirPedido before insert on Pedido
for each row
declare 
pu ITENS.preço%type:=0;

begin 
SELECT preço into pu FROM ITENS where ITENS.IDITEM=:new.IDITEM;
:new.precounidade := pu;
:new.total := (quantidade*pu);
end;
/
gera este este erro :

Selecionar tudo

7/16     PLS-00201: identifier 'QUANTIDADE' must be declared

quando executo desta forma :

Selecionar tudo

CREATE or replace trigger inserirPedido before insert on Pedido
for each row
declare 
pu ITENS.preço%type:=0;
codigo itens.IDITEM%type;
quant pedido.quantidade%type:=0;

begin 
SELECT preço ,quantidade into pu,quant FROM ITENS INNER JOIN PEDIDO on ITENS.IDITEM=:new.IDITEM;
:new.precounidade := pu;
:new.total := (quant*pu);
end;
/
O gatilho é aceito,mais ao inserir o dado como por exemplo

Selecionar tudo

INSERT INTO PEDIDO VALUES(5,100);

Selecionar tudo

SQL Error: ORA-00947: not enough values
não te canses preciso de ajuda
Orlando cawende
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 4
Registrado em: Ter, 26 Jul 2016 6:41 am

Consegui identificar o erro , Obrigado pela ajuda não te canses de saber o bem

Selecionar tudo

:new.total := (:new.quantidade*pu);
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 10 visitantes