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.