我有一个简单的过程,我使用游标来获取一些有效的项目。使用这些有效的项目,我获得了一些值并对它们进行了计算。代码如下所示:
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天之后,我出于想法和理由,仍然没有输出。欢迎任何提示或建议。
答案 0 :(得分:0)
我怀疑SQL开发人员因为你的if语句或除零错误而挂起。您可能想要查看其他用户是否正在使用该过程,或者数据库中是否有任何需要被杀死的进程。
如果您可以使用其他名称重新创建过程,则可以显示此内容。
答案 1 :(得分:0)
在重新创建之前关闭该过程。 SQL Developer块打开了程序。
另外,尝试使用不同的包/过程名称创建它。
并且确定它不是零分割问题,创建程序为空......