Javaを使用してOracleデータベースにアクセスしています。
ユーザーのトランザクション(購入または販売)に基づいてユーザーのフィードバックを計算するSQL関数を作成しました。
フィードバック値はテーブルに保存されますTRANSACCOES
。フィードバック列を更新すると関数は正常に機能しますが、「削除」の直後にフィードバックを再計算すると(実際には削除せず、フラグを削除に設定するだけです)、エラーが発生します。ORA-01476: divisor is equal to zero.
そのエラーの後、別のトランザクションで更新を行うと、正常に再計算されます。だから私はこれがなぜ起こるのか分かりません。
関数は次のとおりです。
CREATE OR REPLACE FUNCTION calcula_classificacao (id_user NUMBER
) RETURN FLOAT AS
counter NUMBER;
sumvendr FLOAT;
sumcompr FLOAT;
f FLOAT;
f1 FLOAT;
BEGIN
SELECT COUNT(t.ID_TRANSACCAO) INTO counter
FROM TRANSACCOES t
JOIN ARTIGOS a
ON a.ID_ARTIGO = t.ID_ARTIGO
WHERE ((t.ID_COMPRADOR = id_user AND t.FEEDBACK_COMPRADOR >= 0)
OR (id_user = a.ID_VENDEDOR AND t.FEEDBACK_VENDEDOR >= 0))
AND t.ELIMINADO = 0;
SELECT SUM(t.FEEDBACK_COMPRADOR) INTO sumcompr
FROM TRANSACCOES t
JOIN ARTIGOS a
ON a.ID_ARTIGO = t.ID_ARTIGO
WHERE t.ID_COMPRADOR = id_user
AND t.ELIMINADO = 0
AND t.FEEDBACK_COMPRADOR >= 0;
SELECT SUM(t.FEEDBACK_VENDEDOR) INTO sumvendr
FROM TRANSACCOES t
JOIN ARTIGOS a
ON a.ID_ARTIGO = t.ID_ARTIGO
WHERE id_user = a.ID_VENDEDOR
AND t.ELIMINADO = 0
AND t.FEEDBACK_VENDEDOR >= 0;
IF (sumvendr IS NULL) THEN
sumvendr := 0;
END IF;
IF (sumcompr IS NULL) THEN
sumcompr := 0;
END IF;
sumvendr := sumvendr + sumcompr;
f := (sumvendr*100);
f1 := f/counter;
UPDATE utilizadores SET classificacao = f1 WHERE id_utilizador = id_user;
RETURN f1;
END;