Создать разные порядковые номера для каждого файла - PullRequest
0 голосов
/ 23 мая 2019

Я использую SQL-загрузчик для загрузки файлов .csv в мою таблицу оракулов.У меня есть несколько файлов с одинаковыми столбцами.Каждый файл имеет около 500 нечетных записей.У меня есть 1 дополнительный столбец "COLUMN5" в таблице, которая не находится в файле .csv.Мне нужно обновить COLUMN5 с 1 уникальным номером для каждого файла .csv.

Подобно первому CSV-файлу 500 записей, поэтому для всех 500 записей это должен быть 1 уникальный номер.Второй CSV-файл, содержащий 300 записей, поэтому для всех этих 300 записей следующий уникальный номер.Есть ли способ добиться этого.Я сделал ниже.

Я использую последовательность Number.Nextval, но она ставит один номер для каждой записи.

Ниже мой контрольный файл.

LOAD DATA

INFILE 'sample.csv'
INFILE 'sample2.csv'

ДОБАВИТЬ В ПОЛЕ TABLE TABLE1, ПРЕКРАЩАЕМЫЕ "," ОПЦИОНАЛЬНО ЗАКРЫТЫМ "", COLUMN4, COLUMN5 "NUMBER.NEXTVAL")

1 Ответ

0 голосов
/ 23 мая 2019

У меня было похожее требование, когда мне нужно было добавить load_date и идентификатор последовательности в каждую строку для каждого файла, который был загружен в таблицу.Таким образом, было легко выполнить запрос по дате или, если нужно было «откатить» определенный файл, мы могли бы удалить, если идентификатор последовательности загрузки соответствовал рассматриваемому файлу.Сначала я создал последовательность с именем X_LOAD_SEQ для хранения текущего значения между сессиями.Затем я создал пакет с переменными load_date и load_seq_id вместе с функциями для их возврата.В теле пакета код запускается при создании экземпляра, который устанавливает значения.Я добавил столбцы LOAD_DATE и LOAD_SEQ_ID в каждую таблицу, создал пакет и добавил эти строки в конец каждого контрольного файла (обратите внимание, что таблица не может уже содержать столбцы с этими именами):

,LOAD_DATE    date "MM/DD/YYYY" "to_char(trunc(schema.load_seq.get_load_date), 'mm/dd/yyyy')"
,LOAD_SEQ_ID  decimal external  "schema.load_seq.get_load_seq_id"

Пакет:

CREATE OR REPLACE PACKAGE SCHEMA.LOAD_SEQ AS
    /******************************************************************************
       NAME:       LOAD_SEQ
       PURPOSE:    Sets unique load_date and Load_seq_id per session when
                   the package is instantiated.  Package functions are
                   intended to be called from control files so all rows in a
                   file load will have the same load_date and load_seq_id.

                   When the functions are called, the package is instantiated and
                   the code at the bottom is run once for the session, setting the
                   load_date and load_seq_id.  The functions simply return the values
                   which will remain the same for that session.

       EXAMPLE:    ,LOAD_SEQ_ID  DECIMAL EXTERNAL "load_seq.get_load_seq_id"
                   (each row then has the same load_seq_id).

       REVISIONS:
       Ver        Date        Author           Description
       ---------  ----------  ---------------  ------------------------------------
       1.0        2/20/2017   Gary_W           1. Created this package.
    ******************************************************************************/
    NEXT_LOAD_SEQ_ID   NUMBER;
    NEXT_LOAD_DATE     DATE;

    FUNCTION GET_LOAD_SEQ_ID RETURN NUMBER;
    FUNCTION GET_LOAD_DATE   RETURN DATE;

END LOAD_SEQ;
/

CREATE OR REPLACE PACKAGE BODY SCHEMA.LOAD_SEQ AS
    FUNCTION GET_LOAD_SEQ_ID RETURN NUMBER IS
    BEGIN
        RETURN LOAD_SEQ.NEXT_LOAD_SEQ_ID;
    END GET_LOAD_SEQ_ID;

    FUNCTION GET_LOAD_DATE RETURN DATE IS
    BEGIN
        RETURN LOAD_SEQ.NEXT_LOAD_DATE;
    END GET_LOAD_DATE;

BEGIN
    -- This code is run once, when the package is first called by the session.
    -- It sets the package variables which then do not change during the life of the session.
    SELECT SYSDATE, X_LOAD_SEQ.NEXTVAL
    INTO LOAD_SEQ.NEXT_LOAD_DATE, LOAD_SEQ.NEXT_LOAD_SEQ_ID
    FROM DUAL;
END LOAD_SEQ;
/
...