Добавьте недопустимые примечания для каждой недопустимой записи, вставленной в недопустимую таблицу в oracle - PullRequest
1 голос
/ 05 мая 2020

У меня есть cursor, который вставляет действительные данные в действительную таблицу и недопустимые данные в недопустимую таблицу на основе нескольких критериев. Ниже мой курсор logi c для того же.

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;
l_maint_zone_name r4g_lb.mantainenceboundary_evw.maintenancezonename%type;
l_state_code r4g_lb.mantainenceboundary_evw.jiostatecode%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 and
                      jumper_flag is null
               )               
  loop 
  
  select max(jiostatename)
      into l_state_name
      from r4g_lb.mantainenceboundary_evw
      where jiostatename = cur_r.rj_state_name
      and rownum = 1;
      
--dbms_output.put_line('test');

      select max(maintenancezonecode), max(maintenancezonename)
      into l_maint_zone_code, l_maint_zone_name
      from r4g_lb.mantainenceboundary_evw
      where maintenancezonecode = cur_r.rj_maintenance_zone_code
      and maintenancezonename = cur_r.rj_maintenance_zone_name
      and rownum = 1;
  
 
   
      if length(cur_r.rj_span_id) =  '21'
          and cur_r.inventory_status_code = 'IPL'
          and regexp_like(cur_r.rj_span_id, 'SP(N|Q|R|S).*_(BU|MP)$')
          and NVL(INSTR(cur_r.RJ_INTRACITY_LINK_ID, '_'), 1) > 0 
          and cur_r.rj_maintenance_zone_code = l_maint_zone_code
          and cur_r.rj_maintenance_zone_name = l_maint_zone_name
          and cur_r.rj_state_name = l_state_name  
          
          
    then 
      begin      
       INSERT INTO tbl_fiber_valid_trans_data 
         (span_id, maintenance_zone_name, maintenance_zone_code, r4g_state_name, inventory_status_code, network_category, network_type, construction_methodology, route_name,intracity_link_id, calculated_length, last_updated_by)
          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, cur_r.rj_network_category, cur_r.rj_network_type, cur_r.rj_construction_methodology, cur_r.rj_route_name, cur_r.rj_intracity_link_id, cur_r.calculated_length, 'Test');
      end;      
   
    elsif LENGTH(cur_r.rj_intracity_link_id) > 8 
              AND LENGTH(cur_r.rj_intracity_link_id) < 21
              and cur_r.inventory_status_code = 'IPL'    
             and cur_r.rj_maintenance_zone_code = l_maint_zone_code
             and cur_r.rj_maintenance_zone_name = l_maint_zone_name
            and cur_r.rj_state_name = l_state_name  
   then
    begin
     INSERT INTO tbl_fiber_valid_trans_data 
         (span_id, maintenance_zone_name, maintenance_zone_code, r4g_state_name, inventory_status_code, network_category, network_type, construction_methodology, route_name,intracity_link_id, calculated_length, last_updated_by)
          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, cur_r.rj_network_category, cur_r.rj_network_type, cur_r.rj_construction_methodology, cur_r.rj_route_name, cur_r.rj_intracity_link_id, cur_r.calculated_length, 'Test');
      
    end;
    else begin
        INSERT INTO TBL_FIBER_INVALID_TRANS_DATA 
          (span_id, maintenance_zone_name, maintenance_zone_code, r4g_state_name, inventory_status_code, network_category, network_type, construction_methodology, route_name,intracity_link_id, calculated_length, last_updated_by, remarks)
          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, cur_r.rj_network_category, cur_r.rj_network_type, cur_r.rj_construction_methodology, cur_r.rj_route_name, cur_r.rj_intracity_link_id, cur_r.calculated_length, 'Test', dynamic remarks based upon the error);
         end;        
         
         
    end if;       
  end loop; 
  
END FIP_VAL_INV_DATA;

Итак, теперь я хочу, если одна строка недействительна и вставляется в недопустимую таблицу, т.е. TBL_FIBER_INVALID_TRANS_DATA. Я также хочу вставить примечания, по какой причине запись недействительна.

Для добавления причины у меня есть несколько условий, упомянутых выше, например,

if length(cur_r.rj_span_id) = '21' предположим, что длина не равна 21 . Мы можем добавлять примечания как The length is not equal to 21 characters.

Таким образом, мы можем динамически добавлять несколько примечаний в столбец примечаний недопустимой таблицы.

Пожалуйста, предложите, как этого добиться.

ОБНОВЛЕНИЕ

Ответы [ 2 ]

0 голосов
/ 11 мая 2020

Для каждой записи курсора определите переменную l_invalid_reason. Выполняйте каждую проверку индивидуально и, если одна из них не удалась, запишите соответствующее сообщение в l_invalid_reason.

Затем, если l_invalid_reason равно null, вставьте его в «действительную» таблицу. В противном случае вставьте в «недопустимую» таблицу, передав l_invalid_reason вместо remarks столбца. Вот сокращенная версия вашего кода, которая делает это, с комментариями.

create or replace PROCEDURE FIP_VAL_INV_DATA AS 

begin
  -- Open your cursor loop
  for cur_r in (select ... ) loop

  declare
    l_invalid_reason VARCHAR2(100);
  begin
    -- Do various select into commands to get extra data needed (e.g. l_state_name, l_maint_zone_code, and l_maint_zone_name
    select max(jiostatename) into l_state_name...
    ...
    ...


    -- Do each validation individually
    -- Notice you are checking for INVALID conditions, not VALID ones, so the
    -- logic is reversed from your posting and you may need to account for possible nulls, 
    -- as in some of the examples below.
    if length(cur_r.rj_span_id) != 21 then
      l_invalid_reason := 'Length is not 21 characters exactly';
    else if nvl(cur_r_inventory_status_code,'XXX') != 'IPL' then
      l_invalid_reason := 'Inventory status code is not IPL';
    else if not regexp_like(cur_r.rj_span_id, 'SP(N|Q|R|S).*_(BU|MP)$') then
      l_invalid_reason := 'Span ID does not match accepted format';
    else if .... (additional validations) ...

    end if;

    -- Check to see whether there is an invalid reason
    if l_invalid_reason is null then
      -- insert into good table
    else
      -- insert into invalid table
        INSERT INTO TBL_FIBER_INVALID_TRANS_DATA 
          (span_id, 
           maintenance_zone_name, 
           maintenance_zone_code, 
           ...
           remarks)
          values
         (cur_r.rj_span_id, 
          cur_r.rj_maintenance_zone_name, 
          cur_r.rj_maintenance_zone_code, 
          ...
          l_invalid_reason);  -- put the PL/SQL variable holding the invalid reason into the INSERT statement
    end if;        
  end;       
  end loop; 

END FIP_VAL_INV_DATA;
0 голосов
/ 05 мая 2020

Вы можете выбрать несколько вариантов. Один из них - создать дополнительную таблицу, в которой будут регистрироваться все обнаруженные вами ошибки. Он состоит из двух столбцов: ID и ERR_CODE. Затем вам нужно будет выполнить поиск по исходному набору данных и вставить строки в эту таблицу, например

ERR_CODE = 1 = length not equal to 21

Затем:

insert into errors (id, err_code)
  select t.id, 1
  from source_table t
  where length(some_column) <> 21;

Это позволяет вам хранить несколько ошибок для одного и того же идентификатора , и это будет нормализованный .


Другой вариант - изменить TBL_FIBER_INVALID_TRANS_DATA и добавить errors varchar2(100); вам все равно придется найти, что не так, и

  • вставить одну строку для каждого идентификатора на описание ошибки (так, несколько строк на идентификатор, если у него много ошибок)
  • вставьте только одну строку для каждого идентификатора и объедините коды ошибок во вновь добавленный столбец (поэтому, если идентификатор содержит ошибки 1, 8 и 12, он будет содержать, например, 1/8/12). Это нормально, если есть только несколько ошибок, чтобы вы могли видеть, что происходит, просто взглянув на них, но - если вы фиксируете больше ошибок, это становится трудно понять, это не нормализуется, и у вас будут дополнительные проблемы если вы хотите представить все ошибки, обнаруженные на одном идентификаторе

На вашем месте, я бы, вероятно, go с опцией № 1 и дополнительной таблицей. Тогда легко создать отчет для конечных пользователей (или себя), присоединив TBL_FIBER_INVALID_TRANS_DATA и ERRORS на одном ID.

...