Oracle - Erro em trigger

JoBlack

Membro
Olá

Estou a fazer um trigger em PL/SQL e dá-me sempre erro de compilação, no entanto, não consigo descobrir onde está esse erro :'(

O código é o seguinte:

Create or Replace trigger VIGIA_STOCK_LINHA
Before Update of Quantidade_Produto on stock
For Each Row
When (new.Quantidade_Produto < new.Minimo_Produto)
begin
if :old.Quantidade_Produto >= Minimo_Produto then
Insert into stock Values(,,,,'Desceu nivel');
else if :old.Quantidade_Produto < Minimo_Produto then
Insert into stock Values(,,,,'Rotura stock');
end if;
end;
/

O objectivo é que, antes de actualizar um produto, o trigger verifique se ele desce abaixo do valor mínimo e se isso acontecer preenche a 5.ª coluna da tabela stock com as strings que estão no if

Obrigado
 
Código:
 Create or Replace trigger VIGIA_STOCK_LINHA
Before Update of Quantidade_Produto on stock
For Each Row
When ([COLOR=Red]new.Quantidade_Produto[/COLOR] < [COLOR=Red]new.Minimo_Produto[/COLOR])
begin
if :old.Quantidade_Produto >= Minimo_Produto then
Insert into stock Values(,,,,'Desceu nivel');
else if :old.Quantidade_Produto < Minimo_Produto then
Insert into stock Values(,,,,'Rotura stock');
end if;
end;
/

Onde assinalei a vermelho faltam os dois pontos, é :new.Quantidade_Produto e :new.Minimo_Produto

Sobre o algoritmo não olhei, apenas sobre a sintaxe.

abraços, HecKel
 
Mas pela sintaxe do PL/SQL só leva os dois pontos qdo está dentro do begin. Coloquei-os onde disseste e não me deixa criar o trigger. Pelo contrário, se estiver conforme tinha, cria o trigger mas com erros de compilação. Obrigado de qquer modo.
 
hummm, eu por acaso ando agora de volta de um trabalho de base de dados em oracle e curiosamente ainda não fiz nenhum trigger de update :P Mas se fizesse metia um begin antes do for each row (apenas apanhei este hábito). Tenta isso, talvez dê.

Volto a realçar que ainda não olhei para o algoritmo..., também ando bastante ocupado de momento e com Oracle também... :(

abraços, HecKel
 
Mas pela sintaxe do PL/SQL só leva os dois pontos qdo está dentro do begin. Coloquei-os onde disseste e não me deixa criar o trigger. Pelo contrário, se estiver conforme tinha, cria o trigger mas com erros de compilação. Obrigado de qquer modo.

Mas que erros de compilação ? ..........

Há-de aparecer alguma mensagem.
 
Compilation failed, line 3 (21:21:55) The line numbers associated with compilation errors are relative to the first BEGIN statement. This only affects the compilation of database triggers.
PL/SQL: ORA-00936: missing expression
Compilation failed, line 3 (21:21:55) The line numbers associated with compilation errors are relative to the first BEGIN statement. This only affects the compilation of database triggers.
PL/SQL: SQL Statement ignored
Compilation failed, line 5 (21:21:55) The line numbers associated with compilation errors are relative to the first BEGIN statement. This only affects the compilation of database triggers.
PL/SQL: ORA-00936: missing expression
Compilation failed, line 5 (21:21:55) The line numbers associated with compilation errors are relative to the first BEGIN statement. This only affects the compilation of database triggers.
PL/SQL: SQL Statement ignored
Compilation failed, line 7 (21:21:55) The line numbers associated with compilation errors are relative to the first BEGIN statement. This only affects the compilation of database triggers.
PLS-00103: Encountered the symbol ";" when expecting one of the following: if


Os erros são estes mas como só agora estou a dar os primeiros passos em PL/SQL não consigo decifrá-los....
 
Julgo que seja mesmo a falta do begin que eu referi...., pois tu tens um end; sem begin associado. A indentação ajuda bastante a ver os erros :)


Código:
  Create or Replace trigger VIGIA_STOCK_LINHA
Before Update of Quantidade_Produto on stock
[COLOR=Blue]begin[/COLOR]
  For Each Row
  [COLOR=Blue]begin[/COLOR]
    When (new.Quantidade_Produto < new.Minimo_Produto)
    begin
      if :old.Quantidade_Produto >= Minimo_Produto then
        Insert into stock Values(,,,,'Desceu nivel');
      else if :old.Quantidade_Produto < Minimo_Produto then
        Insert into stock Values(,,,,'Rotura stock');
      end if;
    end;
  end;
[COLOR=Blue]end;[/COLOR]
/
A azul está o que eu adicionei.

abraços, HecKel
 
Sei que estou a ser chato mas agora dá o erro seguinte

Compilation failed, line 2 (21:41:52) The line numbers associated with compilation errors are relative to the first BEGIN statement. This only affects the compilation of database triggers.
PLS-00103: Encountered the symbol "ROW" when expecting one of the following: in
 
Chato não estás a ser garantidamente :P Eu é que também não estou minimamente à vontade com a matéria e tenho receio de te estar a ajudar mal :(

Vendo um exemplo que tenho numa das aulas práticas iria-te sugerir para substituires o when por um if.

O exemplo que vi é o seguinte (que mostra que afinal não é necessário o begin antes do for each row...

Código:
drop trigger promove_doc;

create trigger promove_doc 
    after update of cod_categoria on docentes
    for each row
    begin
        update historico_categorias
        set data_fim = sysdate-1
        where cod_docente = :new.cod_docente and data_fim is null;
        insert into historico_categorias values
            (:new.cod_docente, :new.cod_categoria, sysdate, null);
    end;
/
Fica esta sugestão agora:

Código:
  Create or Replace trigger VIGIA_STOCK_LINHA
Before Update of Quantidade_Produto on stock
  For Each Row
  [COLOR=Blue]begin[/COLOR]
    if :new.Quantidade_Produto < :new.Minimo_Produto
    begin
      if :old.Quantidade_Produto >= Minimo_Produto then
        Insert into stock Values(,,,,'Desceu nivel');
      else if :old.Quantidade_Produto < Minimo_Produto then
        Insert into stock Values(,,,,'Rotura stock');
      end if;
    end;
  end;
/

Tenta este agora, sff.

abraços, HecKel

PS: Desculpa não estar a ser minimamente exacto..., estou apenas a fazer o que eu faria para tentar resolver o problema :(
 
E eu agradeço-te..... mas tb não dá!

Compilation failed, line 3 (22:08:00) The line numbers associated with compilation errors are relative to the first BEGIN statement. This only affects the compilation of database triggers.
PLS-00103: Encountered the symbol "BEGIN" when expecting one of the following: . ( * @ % & - + / at mod remainder rem then and or || indicator multiset The symbol "then" was substituted for "BEGIN" to continue.
Compilation failed, line 5 (22:08:00) The line numbers associated with compilation errors are relative to the first BEGIN statement. This only affects the compilation of database triggers.
PLS-00103: Encountered the symbol "," when expecting one of the following: ( - + case mod new not null others
 
ups, falta um then no meu código, repara no primeiro if :(

Código:
Create or Replace trigger VIGIA_STOCK_LINHA
Before Update of Quantidade_Produto on stock
  For Each Row
  [COLOR=Blue]begin[/COLOR]
    if :new.Quantidade_Produto < :new.Minimo_Produto [COLOR=Red]then[/COLOR]
    begin
      if :old.Quantidade_Produto >= Minimo_Produto then
        Insert into stock Values(,,,,'Desceu nivel');
      else if :old.Quantidade_Produto < Minimo_Produto then
        Insert into stock Values(,,,,'Rotura stock');
      end if;
    end;
  end;
/
abraços, HecKel
 
O teu erro está logo na 2ª linha. Não podes definir qual é a coluna do update. Apenas defines que é um update na tabela (neste caso a tabela stock).

Before Update on stock

De resto o teu código parece-me bastante confuso. Tens sempre de referenciar as variáveis que usas da tabela como :new ou :old e não usar como usas no if a comparação com um valor de uma variável que não vem de lado nenhum.
Já agora sabias que podes fazer inserts sem teres de passar os vários campos que não interessam a null não sabias?
 
Back
Topo