Поправка к процедуре PL / SQL - PullRequest
0 голосов
/ 10 июля 2019

В настоящее время у нас есть проблема с процедурой.Поправка к процедуре, позволяющая дифференцировать возвращаемое значение, определенное для того, является ли тип машины «ROAD TRAILER» или «ROAD WAGON».

Представление, которое имеет эти значения и знает, что мы можем использовать ' MCH_CODE ', чтобы создать связь между ACTIVE_WORK_ORDER_TAB и EQUIPMENT_FUNCTIONAL_UIV.

Таблицы, которые я считаю необходимыми (некоторые в настоящее время используются)

  • EQUIPMENT_FUNCTIONAL_UIV (требуется для MCH_TYи присоединяется к 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

В противном случае 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;

Ответы [ 2 ]

0 голосов
/ 22 июля 2019

Решил проблему, просто включив в хранимую процедуру следующее:

 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;
0 голосов
/ 10 июля 2019

paperclipsandpaper, Как и 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 ...
...