Использование той же последовательности Oracle при загрузке 2 таблиц с использованием SQLLDR - PullRequest
0 голосов
/ 04 февраля 2020

Я хочу загрузить следующие 2 таблицы, используя SQLLDR. Структура таблиц этих двух таблиц выглядит следующим образом:

CREATE TABLE Customer
(ID varchar2(50), --PK
org_cd  varchar2(50), --PK
NAME VARCHAR2 (255),
Address1 VARCHAR2(1000),
DOB TIMESTAMP(3),
cust_ref_col number  ---used for all the future references to this record since this is a number. This is unique key.
    );

CREATE TABLE Customer_contact
(ID varchar2(50), --PK
org_cd  varchar2(50), --PK 
Contact_id Number, --PK --Running serial # for a given Customer
contact_name varchar2(50),
cust_ref_col number  ---foreign key from Customer table 
);

Вот файл данных, customer.dat (последнее значение столбца 1 является фиктивным, поскольку я хочу сгенерировать последовательность Oracle (partnersequence) Число

PTNR_78814824,ACCT,Tom,123 Church Road, 12-dec-99,1,Ralph,1
PTNR_78814825,FIN,Tom,124 Main Road, 12-dec-99,2,Jody,1
PTNR_78814826,ENGG,Tom,125 Station Road, 12-dec-99,3,Mardy,1

Мой контрольный файл выглядит следующим образом

LOAD DATA
INFILE test.dat
INTO TABLE Customer
APPEND
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' TRAILING NULLCOLS
(ID   ,
 org_cd   ,
 name     ,
 Address1 ,
 DOB      ,
 cust_ref_col   "partnersequence.nextval"
 )

INTO TABLE Customer_contact
APPEND
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' TRAILING NULLCOLS
(ID   ,
 org_cd   ,
 Fill1 Filler,
 Fill2 Filler,
 Fill3 Filler,
 Fill4 Filler,
 cust_ref_col   "partnersequence.nextval"
)

Здесь проблема в том, что cust_ref_col в таблице Customer_contact получает новую последовательность #. Я хочу использовать ту же последовательность c# генерируется для таблицы клиентов. Можете ли вы помочь.

1 Ответ

0 голосов
/ 05 февраля 2020

РЕДАКТИРОВАТЬ: я неправильно понял вопрос ОП. Он искал решение, в котором обе таблицы получали бы один и тот же порядковый номер для каждой строки (я думаю, что ответили в комментариях) Этот ответ показывает, как получить уникальную последовательность для всей загрузки. Хотя это и не ответ, я думаю, что информация будет полезна, поэтому я оставлю ее.

Как вы уже узнали, вызов вашего sequence.nextval в управляющем файле приводит к тому, что он увеличивается для каждой загруженной строки. Хитрость заключается в том, чтобы вызвать пакет, который устанавливает значение один раз при создании экземпляра, а затем вызвать функции пакета, которые возвращают значения для каждой загруженной строки. Так как я уже настроил это для своих нагрузок, я поделюсь с вами тем, что сделал с объяснением. Наши загрузки добавляют в таблицы load_date и load_sequence_id, так что вы увидите это в этих примерах. Предполагается, что читатель уже понимает структуру пакета, поскольку это слишком много, чтобы объяснить здесь, не путая главный вопрос.

Вам нужно будет создать последовательность (у вас уже есть) и пакет. Пакет содержит 2 переменные для хранения load_date и load_seq_id, 2 функции «getter» для их возврата и код для их установки при создании экземпляра. Затем ваш управляющий файл вызовет функции «getter», чтобы вернуть load_date и load_seq_id из пакета, которые будут одинаковыми для каждой строки.

Итак, при запуске загрузки, когда первая строка для загрузки вызывает Функция, чтобы получить последовательность, экземпляр пакета и дата и последовательность устанавливаются, а затем возвращаются. Пока сеанс активен, с этого момента дата / последовательность не будут меняться, и последующие вызовы функций-получателей будут возвращать те же значения.

Пакет spe c и тело:

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.

    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"
                 (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 THC_LOAD_SEQ;
/

CREATE OR REPLACE PACKAGE BODY SCHEMA.LOAD_SEQ AS
  /******************************************************************************
     NAME:       GET_LOAD_SEQ_ID
     PURPOSE:    Return the package variable LOAD_SEQ.NEXT_LOAD_SEQ_ID
                 which is set when the package is instantiated.  It does not
                 change during the session.

     REVISIONS:
     Ver        Date        Author           Description
     ---------  ----------  ---------------  ------------------------------------
     1.0        2/20/2017   Gary_W           1. Created this package.
  ******************************************************************************/
  FUNCTION GET_LOAD_SEQ_ID
    RETURN NUMBER IS
  BEGIN
    RETURN LOAD_SEQ.NEXT_LOAD_SEQ_ID;
  END GET_LOAD_SEQ_ID;

  /******************************************************************************
     NAME:       GET_LOAD_DATE
     PURPOSE:    Return the package variable LOAD_SEQ.NEXT_LOAD_DATE
                 which is set when the package is instantiated.  It does not
                 change during the session.

     REVISIONS:
     Ver        Date        Author           Description
     ---------  ----------  ---------------  ------------------------------------
     1.0        2/20/2017    Gary_W          1. Created this package.
  ******************************************************************************/
  FUNCTION GET_LOAD_DATE
    RETURN DATE IS
  BEGIN
    RETURN LOAD_SEQ.NEXT_LOAD_DATE;
  END GET_LOAD_DATE;
BEGIN
    -- Code outside of the procedures/functions defined in the spec runs 
    -- once on instantiation of the package, 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, partnersequence.NEXTVAL
    INTO   LOAD_SEQ.NEXT_LOAD_DATE, LOAD_SEQ.NEXT_LOAD_SEQ_ID
    FROM   DUAL;
END LOAD_SEQ;
/

В вашем контрольном файле:

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