简体   繁体   English

PL / SQL程序修订

[英]PL/SQL Procedure Amendment

Currently we have an issue with a procedure. 目前,我们的程序存在问题。 An amendment to the procedure to differentiate the returned value determined on if the Machine Type is 'ROAD TRAILER' or 'ROAD WAGON'. 修正了对区分返回值的程序的确定,该返回值取决于“机器类型”是“道路拖车”还是“道路货车”。

The view which has these values and know that we can use ' MCH_CODE ' to create a relationship between ACTIVE_WORK_ORDER_TAB and EQUIPMENT_FUNCTIONAL_UIV. 具有这些值的视图并且知道我们可以使用“ MCH_CODE ”在ACTIVE_WORK_ORDER_TAB和EQUIPMENT_FUNCTIONAL_UIV之间创建关系。

Tables I think are required (some currently in use) 我认为是必需的表(某些正在使用中)

  • EQUIPMENT_FUNCTIONAL_UIV (required for MCH_TYPE and joins on VIA MCH_CODE to ACTIVE_WORK_ORDER_TAB EQUIPMENT_FUNCTIONAL_UIV (MCH_TYPE必需,并通过VIA MCH_CODE加入到ACTIVE_WORK_ORDER_TAB
  • ACTIVE_WORK_ORDER_TAB ACTIVE_WORK_ORDER_TAB

Basically, this is how it should read however, I'm finding it difficult to update the procedure every time I've amended the statement it has broken. 基本上,这就是它应该阅读的方式,但是,我发现每次修改已损坏的语句时,都很难更新该过程。

If the MCH_TYPE is ROAD_WAGON or ROAD_TRAILER and TEMP_ in ('682','720','770','775','784') then return 14 如果MCH_TYPE是ROAD_WAGON或ROAD_TRAILER和TEMP_ in('682','720','770','775','784'),则返回14

ELSEIF the MCH_TYPE is NOT 'ROAD_WAGON' or 'ROAD_TRAILER' and TEMP_ in ('720') then return 14 ELSEIF MCH_TYPE不是'ROAD_WAGON'或'ROAD_TRAILER'和TEMP_ in('720'),然后返回14

Example of procedure below: 以下程序示例:

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;

paperclipsandpaper, Like Tad I am not sure what your issue is but if you are trying to add another condition when the temp_ is 720 then maybe the following will help you figure out your problem. 纸夹和纸,像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 ...

Resolved the problem by simply including the following in to the stored procedure: 通过将以下内容简单地包含到存储过程中,解决了该问题:

 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;

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM