1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

Oracle - Erro em trigger

Discussão em 'Programação' iniciada por JoBlack, 8 de Dezembro de 2006. (Respostas: 12; Visualizações: 1973)

  1. 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
     
  2. HecKel

    HecKel The WORM

    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
     
  3. 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.
     
  4. HecKel

    HecKel The WORM

    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
     
  5. NQ

    NQ Power Member

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

    Há-de aparecer alguma mensagem.
     
  6. 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....
     
  7. HecKel

    HecKel The WORM

    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
     
  8. 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
     
  9. HecKel

    HecKel The WORM

    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 :(
     
  10. 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
     
  11. HecKel

    HecKel The WORM

    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
     
  12. tb não dá, já tinha visto esse....
     
  13. Karski

    Karski Power Member

    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).

    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?
     

Partilhar esta Página