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

Erro de mutação após o acionador de inserção


No oracle existem dois níveis de triggers:nível de linha e nível de tabela.

Os acionadores de nível de linha são executados for each row . Gatilhos de nível de tabela executados por instrução, mesmo se uma instrução mudou mais de uma linha.
Em um gatilho de nível de linha, você não pode selecionar/atualizar a própria tabela que possui o gatilho:você receberá um erro de mutação.

Nesse caso, não há necessidade de uma instrução UPDATE. Apenas tente isto:
CREATE OR REPLACE TRIGGER aso_quote_cuhk_trigger
BEFORE INSERT
ON aso.aso_quote_headers_all
FOR EACH ROW
BEGIN
 :new.quote_expiration_date=sysdate+90;     
END;
/

EDITAR Rajesh mencionou que é possível que, antes de inserir uma nova linha, o OP queira atualizar todos os outros registros no aso_quote_headers_all tabela.

Bem, isso é viável, mas é um pouco complicado. Para fazer isso corretamente, você precisará
  1. Um pacote pl/sql e uma variável no cabeçalho do pacote que é modificada pelos gatilhos. Essa variável pode ser uma lista contendo os IDs dos registros recém-inseridos. O nível de linha após o acionador de inserção adicionaria um novo ID à lista. O conteúdo desta variável de pacote será diferente para cada sessão diferente, então vamos chamar essa variável de session_variable .
  2. Nível de linha após o acionador de inserção, que adicionaria um novo ID à session_variable .
  3. Nível de tabela após o acionador de inserção que obteria IDs da session_variable , processe o ID e remova-o da session_variable . Este gatilho pode executar seleções/atualizações necessárias no aso_quote_headers_all. Depois que um ID recém-inserido é processado, esse acionador deve garantir que ele seja removido da session_variable .