0

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;
4

1 に答える 1

0

私の問題の解決策を見つけました。私はユーザーからの多くの購入で機能をテストしていましたが、売り手は売りしかありませんでした。したがって、購入を削除するときは、売り手の唯一の販売を削除していました。したがって、この関数はユーザーの最後の販売/購入であるという事実を妨げていなかったため、そのエラーが発生していました。再計算するときに、トランザクションに関与する両方のユーザーのフィードバックを再計算するためです。

于 2013-01-05T14:35:48.477 に答える