【问题标题】:PL/SQL Procedure AmendmentPL/SQL 过程修正
【发布时间】: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


【解决方案1】:

回形针和纸,像 Tad 我不确定您的问题是什么,但如果您尝试在 temp_ 为 720 时添加另一个条件,那么以下内容可能会帮助您找出问题。

elsif temp_ in (682,770,775,784) then serv_ := 14;
elsif temp_ = 720 and mch_type not in ('ROAD_WAGON','ROAD_TRAILER') then serv_ := 14;
elsif temp- = 950 ...

【讨论】:

  • 我在上面的 TADS 评论中包含了一些注释。基本上需要额外的条件,我正在努力包含一个额外的视图 EQUIPMENT_FUNCTIONAL_UIV 来修改条件。有关更多信息,请参阅 Tad 的评论
【解决方案2】:

通过简单地将以下内容包含到存储过程中来解决问题:

 BEGIN
  FOR x_ IN get_preacc LOOP


     BEGIN
      temp_ := to_number(x_.codeno_b);
      MCH_TYPE := MCH_TYPE;
     EXCEPTION

     WHEN OTHERS then
        temp_ := 0;
     END;

     IF temp_ >= 450 
       and temp_ <= 470 THEN
        serv_ := '12';

         ELSIF (temp_ = 720 and (MCH_TYPE = 'ROAD WAGON' OR  MCH_TYPE = 'ROAD TRAILER'))
         then serv_ := '20';  

         ELSIF temp_ = 682
         or (temp_ = 720 and (MCH_TYPE != 'ROAD WAGON' OR  MCH_TYPE != 'ROAD TRAILER'))
         or temp_ = 770 
         or temp_ = 775 
         or temp_ = 784 
         THEN
         serv_ := '14';

     ELSIF temp_ = 950 THEN
        serv_ := '12';

     ELSIF temp_ = 741 
       or temp_ = 773 
       or temp_ = 774 
       or temp_ = 775 
       or temp_ = 740 THEN
       serv_ := '22';


     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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-11-03
    • 2012-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多