Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/370.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
获取java.sql.SQLDataException:ORA-01476:计算选择数时,除数等于零_Java_Sql_Oracle - Fatal编程技术网

获取java.sql.SQLDataException:ORA-01476:计算选择数时,除数等于零

获取java.sql.SQLDataException:ORA-01476:计算选择数时,除数等于零,java,sql,oracle,Java,Sql,Oracle,我正在使用Java访问Oracle数据库 我创建了一个SQL函数,它根据用户的交易(购买或销售)计算用户的反馈 反馈值存储在表TRANSACCOES中。当我更新反馈列时,该函数工作正常,但当我在“删除”后立即重新计算反馈时(我不是真的删除它,只是将一个标志设置为“已删除”),我得到一个错误:ORA-01476:除数等于零。 如果在那个错误之后,我对另一个事务进行了更新,它会重新计算。所以我不知道为什么会这样 以下是函数: CREATE OR REPLACE FUNCTION calcula_cl

我正在使用Java访问Oracle数据库

我创建了一个SQL函数,它根据用户的交易(购买或销售)计算用户的反馈

反馈值存储在表
TRANSACCOES
中。当我更新反馈列时,该函数工作正常,但当我在“删除”后立即重新计算反馈时(我不是真的删除它,只是将一个标志设置为“已删除”),我得到一个错误:
ORA-01476:除数等于零。

如果在那个错误之后,我对另一个事务进行了更新,它会重新计算。所以我不知道为什么会这样

以下是函数:

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;

找到了解决我问题的办法。我在测试这个功能,从一个用户那里买了很多东西,但是卖家只卖出了一个。因此,当我删除购买时,我删除了卖家的唯一卖出。因此,由于该函数没有阻止用户最后一次销售/购买,因此它得到了该错误。因为当它重新计算时,它会重新计算参与事务的两个用户的反馈。

删除第一个查询后,我不满意,因此计数变为0@Srinivas我知道这一点,但不明白为什么它在移除后立即返回零。因为,当我以后运行它时,它会工作。@ferozakbar你能说得更具体一点吗?因为如果我在删除方法完成后运行该函数,它就会工作。谢谢,正如前面所说的,问题出在这一行f/计数器上,可能在删除您的id之后,Transacco只停留在元素设置为已删除的行上。因此,使计数器=0。