Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

como acionar uma atualização em um valor de linha de tabela usando um valor de linha de outra tabela no Apex Oracle SQL?


Você está usando os valores :OLD em seu gatilho, o que parece problemático. Em um INSERT os valores :OLD são todos NULL. Então, no caso de um INSERT, no mínimo, parece que você gostaria de usar os valores :NEW.

Em um UPDATE, os valores :OLD contêm os valores pré-atualização. Não sei como sua tabela de ações está sendo mantida, mas parece-me que você gostaria de adicionar os valores :OLD de volta ao estoque e remover os valores :NEW do estoque, supondo que ORDER_QUANTITY e STOCK_ID possam mudar.

Quando você está fazendo um DELETE, os valores :OLD contêm os valores de pré-exclusão, mas os valores :NEW são todos NULL (faz sentido, se você pensar bem). Portanto, no caso de uma exclusão, parece que você deseja usar os valores :OLD. No entanto, se você estiver excluindo um pedido de compra, você realmente quer ajustar o estoque? Acho que você precisaria de algum tipo de status no pedido para saber se ele foi processado ou cancelado ou o que quer que seja, e só adicionar o estoque de volta à tabela de estoque a granel se o pedido nunca for atendido.

De qualquer forma, uma maneira de reescrever seu gatilho seria:
create or replace trigger UPDATE_ON_PURCHASE
  BEFORE insert or update or delete on PURCHASE_ORDER
  for each row
  begin
    IF INSERTING THEN
      UPDATE bulk_stock
        SET BULK_QUANTITY = BULK_QUANTITY - :NEW.ORDER_QUANTITY
        WHERE STOCK_ID = :NEW.STOCK_ID; 
    ELSIF UPDATING THEN
      UPDATE BULK_STOCK
        SET BULK_QUANTITY = BULK_QUANTITY + :OLD.ORDER_QUANTITY
        WHERE STOCK_ID = :OLD.STOCK_ID; 

      UPDATE BULK_STOCK
        SET BULK_QUANTITY = BULK_QUANTITY - :NEW.ORDER_QUANTITY
        WHERE STOCK_ID = :NEW.STOCK_ID; 
    ELSIF DELETING THEN
      UPDATE BULK_STOCK
        SET BULK_QUANTITY = BULK_QUANTITY + :OLD.ORDER_QUANTITY
        WHERE STOCK_ID = :OLD.STOCK_ID;
    END IF;
  end;

Não tenho certeza de que essa lógica seja realmente o que você queria, pois não entendo completamente o que você está tentando fazer, principalmente no caso DELETE, portanto, tome-o como exemplo e aplique qualquer lógica que sua situação exigir.

Também direi que acho que colocar essa lógica em um gatilho é uma má escolha. Lógica de negócios como essa não deve ser implementada em um gatilho - é melhor colocá-lo em um procedimento e chamar o procedimento quando necessário. Colocar lógica de negócios em gatilhos pode ser problemático .

Boa sorte.