无法处理ORA-01476:“除数等于零”

时间:2014-07-29 07:44:15

标签: oracle oracle-sqldeveloper

我有一个简单的过程,我使用游标来获取一些有效的项目。使用这些有效的项目,我获得了一些值并对它们进行了计算。代码如下所示:

PROCEDURE p_loadanalyse
IS
qty_1       NUMBER;
qty_2      NUMBER := 0;
V_CALC      Number := 0;
Item_No_Rec valid_items%Rowtype;

CURSOR c_validitem
IS
SELECT DISTINCT item_no
From valid_items A;

Begin

For Item_No_Rec In C_Validitem

Loop

SELECT ROUND(SUM(Qty1),2)
INTO qty_1 -- FCST_QTY_PCD
FROM qty1_table
WHERE item_No        = item_No_rec.item_No;

SELECT SUM(Qty2)
INTO qty_2
FROM qty2_table
WHERE A.Item_No       = Item_No_Rec.Item_No;

V_CALC      := (QTY_1  /QTY_2)*100;

Dbms_Output.Put_Line('deviation' ||V_Deviation); 

END LOOP;
EXCEPTION 
WHEN NO_DATA_FOUND THEN
qty_1 := 0;
qty_2 := 0;
WHEN OTHERS THEN
DBMS_output.put_line('There is an error');
END;

当QTY2为0时,问题显然出现在V_CALC := (QTY1 /QTY2)*100;语句中。所以我尝试处理它:

 IF QTY_2 <> 0 THEN
  V_CALC      := (QTY_1  /QTY_2)*100;
 ELSE
  V_CALC      := 0;
 END IF;

当我尝试编译程序时,这令我惊讶地挂起了我的SQL Developer。并在10-11分钟后给出timeout occurred while trying to lock object。我所做的不是火箭科学,甲骨文本应该按照我想要的方式行事,而是我必须思考并尝试所有其他方式来处理这种鸿沟,如:

  • 包括EXCEPTION WHEN ZERO_DIVIDE THEN QTY_2 := 0;
  • 使用CASE代替IF

在尝试了所有排列和组合3天之后,我出于想法和理由,仍然没有输出。欢迎任何提示或建议。

2 个答案:

答案 0 :(得分:0)

我怀疑SQL开发人员因为你的if语句或除零错误而挂起。您可能想要查看其他用户是否正在使用该过程,或者数据库中是否有任何需要被杀死的进程。

如果您可以使用其他名称重新创建过程,则可以显示此内容。

答案 1 :(得分:0)

在重新创建之前关闭该过程。 SQL Developer块打开了程序。

另外,尝试使用不同的包/过程名称创建它。

并且确定它不是零分割问题,创建程序为空......