Загрузка данных Apex: 2 числовых столбца из CSV-файла выбирают 1 в зависимости от условия и загружают в таблицу - PullRequest
0 голосов
/ 09 февраля 2019

У меня есть проблема в Oracle Apex Data Load, которую я постараюсь объяснить простым способом:

Я хочу скопировать данные CSV (копировать / вставить) в приложении Data Load и применить преобразование, иправила и загрузить данные в таблицу BIKE.

  • csv столбцы (тип, сумма-a, сумма-b)

    blue, 10, 100
    green, 20, 200
    
  • столбцы таблицы BIKE (тип, сумма)

Я хочу создать преобразование, чтобы проверить, является ли значение столбца в таблице BIKE «синим», а затем загрузить сумму-b, а другую мудрую сумму-а.

Может ли кто-нибудь помочь мне в этом?

Спасибо

1 Ответ

0 голосов
/ 13 февраля 2019

Создайте промежуточную таблицу, например, вот так (вам нужно настроить детали столбцов в соответствии с вашей моделью данных):

create table bike_staging
(
   apex_session number not null,
   bike_id number not null,
   bike_type varchar2(100) not null,
   amount_a number,
   amount_b number
);

Добавить триггер для заполнения session_id:

create or replace trigger bi_bike_staging
before insert on bike_staging for each row
begin
  :new.apex_session := v('APP_SESSION');
end bi_bike_staging;

Добавьте два процесса на третью страницу мастера загрузки данных с обеих сторон процесса «Подготовка выгруженных данных», например:

enter image description here

Код для «удаления промежуточной таблицы» будет выглядеть следующим образом:

delete bike_staging where apex_session = :APP_SESSION;

Код для «загрузки велосипедов» может выглядеть примерно так:

merge into bikes t
using (select bike_id,
              bike_type,
              case bike_type
              when 'BLUE' then amount_b
              else amount_a
              end as amount
        from bike_staging
        where apex_session = :APP_SESSION
       ) s
on (t.bike_id = s.bike_id)
when matched then update set
  t.bike_type = s.bike_type,
  t.amount = s.amount
when not matched then insert (bike_id, bike_type, amount)
values (s.bike_id, s.bike_type, s.amount);

delete bike_staging where apex_session = :APP_SESSION;

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

...