ORA-06502: PL / SQL: цифра c или ошибка значения: ошибка преобразования символа в число при вставке данных через курсор - PullRequest
0 голосов
/ 21 апреля 2020

У меня есть простой cursor, который выбирает данные и вставляет данные, основанные на условиях, в 2 таблицы. Теперь для действительных условий я получаю ошибку ниже. Пожалуйста, объясните мне, как проверить и сопоставить условия.

Ошибка ниже

ORA-06502: PL / SQL: цифра c или ошибка значения: от символа до ошибка преобразования чисел ORA-06512: в "APP_FIBERINV.FIP_VAL_INV_DATA", строка 37

и ниже курсор.

create or replace PROCEDURE FIP_VAL_INV_DATA AS 
l_state_name r4g_lb.mantainenceboundary_evw.jiostatename%type;
l_maint_zone_code r4g_lb.mantainenceboundary_evw.maintenancezonecode%type;

begin

  for cur_r in (select rj_span_id, 
                       rj_maintenance_zone_name,
                       rj_maintenance_zone_code,
                       rj_state_name,
                       rj_network_category,
                       rj_network_type,
                       rj_construction_methodology,
                       inventory_status_code,
                       rj_route_name,
                       rj_intracity_link_id,
                       calculated_length 
                      from app_fttx.transmedia@sat   
                      where rownum < 100
               )
               
  loop         
    select max(jiostatename) 
      into l_state_name
      from r4g_lb.mantainenceboundary_evw
      where jiostatename = cur_r.rj_state_name
      and rownum = 1;

      select max(maintenancezonecode) 
      into l_maint_zone_code
      from r4g_lb.mantainenceboundary_evw
      where maintenancezonecode = cur_r.rj_maintenance_zone_code
      and rownum = 1;
   
       if length(cur_r.rj_span_id) = '21'        
     --  if cur_r.rj_span_id > '0'        
          and l_state_name = 1
          and cur_r.inventory_status_code = 'IPL'
          and regexp_like(cur_r.rj_span_id, 'SP(N|Q|R|S).*_(BU|MP)$')
          and l_maint_zone_code = 1
          
    then       
       INSERT INTO tbl_fiber_valid_trans_data 
         (span_id, maintenance_zone_name, maintenance_zone_code, r4g_state_name, inventory_status_code)
          values 
         (cur_r.rj_span_id, cur_r.rj_maintenance_zone_name, cur_r.rj_maintenance_zone_code, cur_r.rj_state_name, cur_r.inventory_status_code);
    else
        INSERT INTO TBL_FIBER_INVALID_TRANS_DATA 
          (span_id, maintenance_zone_name, maintenance_zone_code, r4g_state_name, inventory_status_code)
           values 
          (cur_r.rj_span_id, cur_r.rj_maintenance_zone_name, cur_r.rj_maintenance_zone_code, cur_r.rj_state_name, cur_r.inventory_status_code);
    end if;       
  end loop;  
END FIP_VAL_INV_DATA;

ОБНОВЛЕНИЕ

Структура данных таблицы tbl_fiber_valid_trans_data

Name                     Null Type           
------------------------ ---- -------------- 
SPAN_ID                       NVARCHAR2(100) 
MAINTENANCE_ZONE_NAME         NVARCHAR2(100) 
MAINTENANCE_ZONE_CODE         NVARCHAR2(50)  
R4G_STATE_NAME                NVARCHAR2(50)  
STATE_NAME                    NVARCHAR2(50)  
NETWORK_CATEGORY              NVARCHAR2(100) 
NETWORK_TYPE                  NVARCHAR2(100) 
CONSTRUCTION_METHODOLOGY      NVARCHAR2(50)  
INVENTORY_STATUS_CODE         NVARCHAR2(20)  
OWNERSHIP_TYPE_CODE           NVARCHAR2(20)  
ROUTE_NAME                    NVARCHAR2(100) 
INTRACITY_LINK_ID             NVARCHAR2(100) 
CALCULATED_LENGTH             NUMBER(38,8)   
LAST_UPDATED_BY               NVARCHAR2(100) 
LAST_UPDATED_DATE             DATE 

1 Ответ

1 голос
/ 21 апреля 2020

Не зная тип данных ваших столбцов, довольно сложно угадать реальную ошибку, но я думаю, что она исходит из критерия and l_state_name = 1, потому что l_state_name должен быть varchar и, как вы сравниваете его с 1, движком пытается привести l_state_name к номеру

Исправить с помощью and l_state_name = '1'

Должно быть то же самое с and l_maint_zone_code = 1 => and l_maint_zone_code = '1'

Кстати изменить также length(cur_r.rj_span_id) = '21' до length(cur_r.rj_span_id) = 21

...