Oracle
 sql >> база данни >  >> RDS >> Oracle

Кои кодове имат съответствие в db

Създайте външна таблица върху вашия CSV файл. Това са много спретнати неща, които ни позволяват да правим заявки за съдържанието на OS файл в SQL. Научете повече .

След това е просто да подадете заявка:

select csv.id
       , case ( when tgt.id is null then 'invalid' else 'valid') end as valid_id
from your_external_tab csv
       left join target_table tgt on (csv.id = tgt.id)

Изпълнението е въпрос на контекст. В този случай зависи от това колко често се променят данните в CSV и колко често трябва да го правим заявки. Ако файлът се създава веднъж на ден и ние трябва да проверяваме стойностите само след като бъде доставен, тогава външна таблица е най-ефективното решение. Но ако този набор от данни е постоянно хранилище, което трябва да се запитва често, тогава режийните разходи за запис в таблица с купчини очевидно са оправдани.

За мен CSV файл, състоящ се от куп идентификатори и нищо друго, звучи като преходни данни и отговаря на случая на използване за външни таблици. Но ОП може да има допълнителни изисквания, които те не са споменали.

Ето алтернативен подход, който не изисква създаване на постоянни обекти на база данни. Следователно той е по-малко елегантен и вероятно ще работи по-зле.

Той чете CSV файла усилено, използвайки UTL_FILE и попълва колекция, базирана на SYSTEM.NUMBER_TBL_TYPE, предварително дефинирана колекция (вложена таблица от NUMBER), която трябва да е налична във вашата база данни на Oracle.

declare
    ids system.number_tbl_type;
    fh utl_file.file_handle;
    idx pls_integer := 0;
    n pls_integer;
 begin
    fh := utl_file.fopen('your_data_directory', 'your_data.csv', 'r');
    begin
        utl_file.get_line(fh, n);
        loop  
            idx := idx + 1;
            ids.extend();
            ids(idx) := n;
            utl_file.get_line(fh, n);
        end loop;
   exception
      when no_data_found then
          if utl_file.is_open(fh) then
             utl_file.fclose(fh);
          end if;
     when others then
          raise;
  end;
  for id_recs in  in  ( select csv.column_value 
              , case ( when tgt.id is null then 'invalid' else 'valid') end as valid_id
                from (select * from table(ids)) csv
            left join target_table tgt on (csv.column_value = tgt.id)
  ) loop
  dbms_output.put_line '(ID '||id_recs.column_value || ' is '||id_recs.valid_id);
  end loop;
end;

Забележка:Не съм тествал този код. Принципът е стабилен, но подробностите може да се нуждаят от отстраняване на грешки;)




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Преобразувайте всеки знак в низ в ред

  2. Как мога да разположа .NET приложение, което използва ODAC, без да инсталирам целия компонент на потребителя?

  3. Как да използвам динамичен параметър в IN клауза на JPA именувана заявка?

  4. Как да стартирате съхранена процедура в oracle sql developer?

  5. Как да преименувате възел на Oracle XMLTYPE