【发布时间】:2019-11-20 03:08:43
【问题描述】:
目前我们的程序存在问题。对程序的修正,以区分根据机器类型是“ROAD TRAILER”还是“ROAD WAGON”确定的返回值。
具有这些值并知道我们可以使用“MCH_CODE”在 ACTIVE_WORK_ORDER_TAB 和 EQUIPMENT_FUNCTIONAL_UIV 之间创建关系的视图。
我认为需要的表格(一些目前正在使用)
- EQUIPMENT_FUNCTIONAL_UIV(MCH_TYPE 和 VIA MCH_CODE 与 ACTIVE_WORK_ORDER_TAB 的连接是必需的
- ACTIVE_WORK_ORDER_TAB
基本上,它应该是这样读的,但是,我发现每次修改它已经破坏的语句时都很难更新该过程。
如果 MCH_TYPE 是 ROAD_WAGON 或 ROAD_TRAILER 并且 TEMP_ in ('682','720','770','775','784') 则返回 14
ELSEIF MCH_TYPE 不是 'ROAD_WAGON' 或 'ROAD_TRAILER' 和 TEMP_ in ('720') 然后返回 14
以下程序示例:
temp_ NUMBER;
serv_ VARCHAR2(100);
attr_ VARCHAR2(2000);
info_ VARCHAR2(2000);
WO_STATUS_ID_ VARCHAR2(200);
Record_Found_ BOOLEAN;
contract_ VARCHAR2(200);
Pre_Accounting_id_ NUMBER;
LoopCount_ NUMBER;
CURSOR get_preacc IS
SELECT *
FROM PRE_ACCOUNTING
WHERE pre_accounting_id = Pre_Accounting_id_ ;
CURSOR get_rec IS
SELECT WO_STATUS_ID,contract
FROM ACTIVE_WORK_ORDER_TAB
WHERE PRE_ACCOUNTING_ID = Pre_Accounting_id_;
BEGIN
Pre_Accounting_Id_ := Client_sys.Get_Item_Value('PRE_ACCOUNTING_ID', Pre_Accounting_Attr_);
Record_Found_ := FALSE;
FOR c_get_rec IN get_rec LOOP
Record_Found_ := TRUE;
WO_STATUS_ID_ := c_get_rec.wo_status_id;
contract_ := c_get_rec.contract;
END LOOP;
IF NVL(WO_STATUS_ID_,'XXX1') NOT IN ('RELEASED','STARTED','FAULTREPORT', 'WORKREQUEST') THEN
RETURN;
END IF;
LoopCount_ := 0;
<<IF_ERROR_LOOP>>
BEGIN
FOR x_ IN get_preacc LOOP
BEGIN
temp_ := to_number(x_.codeno_b);
EXCEPTION
WHEN OTHERS then
temp_ := 0;
END;
IF temp_ >= 450 and temp_ <= 470 THEN
serv_ := '12';
ELSIF temp_ = 682 or temp_ = 720 or temp_ = 770 or temp_ = 775 or temp_ = 784 THEN
serv_ := '14';
ELSIF temp_ = 950 THEN
serv_ := '12';
ELSIF temp_ = 685 THEN
serv_ := '22';
ELSE
serv_ := '16';
END IF;
IF nvl(x_.CODENO_C,'X') = serv_ THEN
RETURN;
END IF;
Client_SYS.clear_Attr(attr_);
Client_SYS.Add_To_Attr('CODENO_C', serv_,attr_);
Client_SYS.Add_To_Attr('COMPANY', Site_API.Get_Company(contract_),attr_);
Client_SYS.Add_To_Attr('CONTRACT', contract_,attr_);
PRE_ACCOUNTING_API.Modify__(info_,x_.objid,x_.objversion,attr_,'DO');
END LOOP;
EXCEPTION
WHEN OTHERS THEN
LoopCount_ := LoopCount_ +1;
IF LoopCount_ < 20 THEN
DBMS_LOCK.SLEEP (20);
GOTO IF_ERROR_LOOP;
END IF;
END;
【问题讨论】:
-
这个问题到底是什么有点不清楚。需要修复什么?
-
如果您尝试使用问题中提到的
ELSEIF,它应该是ELSIF。否则,关于究竟什么是“损坏”的更多细节会有所帮助。 -
@TadHarrison 我们最近修改了程序运行的应用程序。有了这个修改,这个条件就不起作用了,因为 temp_ 列返回 720,这可能意味着 14 或 20。为了解决这个问题,我发现如果我们包含一个额外的 MCH_TYPE 条件,它可以区分应该返回哪个值。如果 temp_ = '720' 并且 MCH_TYPE 是 ROAD_TRAILER 或 ROAD_WAGON 则返回 20 ELSIF temp_ = '720' 并且 MCH_TYPE 不是 ROAD_TRAILER 或 ROAD_WAGON 然后返回 14 问题是我不编写程序并且我正在努力包含视图 EQUIPMENT_FUNCTIONAL_UIV 和然后修改条件
标签: sql oracle plsql procedure