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

Acionar o erro de instrução if-else não sendo gerado


O gatilho funciona conforme o esperado quando você atualiza a tabela manualmente.

Quando chamado a partir do procedimento, o gatilho não informa um valor inválido e mostra o valor total como pago, mesmo que não tenha sido - o valor do pagamento não é alterado, mas as outras colunas são.

Isso porque a instrução de atualização do seu procedimento é:
UPDATE Payment
SET paymenttype = PAYMENT_TYPE,
  paymentdate = TO_CHAR(sysdate,'DD/MON/YYYY'),
  paymentstatus = v_paymentstatus
where paymentid = PAYMENT_ID;

Você não está dizendo para atualizar o valor, então o gatilho não tem um :new modificado valor - o antigo e o novo são os mesmos. Você precisa incluir essa coluna na atualização:
UPDATE Payment
SET paymenttype = PAYMENT_TYPE,
  paymentdate = TO_CHAR(sysdate,'DD/MON/YYYY'),
  paymentamount = amt_pay,
  paymentstatus = v_paymentstatus
where paymentid = PAYMENT_ID;

db<>fiddle

O TO_CHAR(sysdate,'DD/MON/YYYY') parece estranho - a coluna da tabela deve ser uma data e não uma string, então você não deve converter esse valor em uma string; se a coluna for uma data, você estará contando com as configurações de NLS do cliente para convertê-la de volta. Se você está tentando ignorar a hora atual, você pode fazer TRUNC(sysdate) em vez de.

Você também não deve confiar em dbms_output no corpo do procedimento - você não pode controlar se alguém chamando isso tem saída habilitada para que eles nunca vejam um problema. Como você está gerando uma exceção no gatilho, você pode fazer o mesmo no procedimento para os outros erros.