Константа объединения и динамическое поле в загрузчике SQL

#sql #oracle #sql-loader

Вопрос:

Я пытаюсь объединить 2 поля в одно поле в файле CTL, а затем загрузить данные через загрузчик SQL.

пример:

 TABLE - "EMPINFO" where the fields are     
(name,mobile_no,service,data_insert_time).
 

Приведенные данные являются (Jack,005492906405,IT)

Но при загрузке данных в таблицу мне нужно объединить 2 поля (одно постоянное, а другое-дата) для поля data_insert_time таблицы.

Таким образом, столбец data_insert_time должен быть одинаковым EMPLOYEE-20200304 (EMPLOYEE-SYSTEMDATE) для всех данных.

EMPLOYEE является постоянным для всех данных

Ответ №1:

Я не говорю, что вы не можете сделать это в SQL*Loader, но — зачем беспокоиться? Установите data_insert_time значение столбца по умолчанию, например

 SQL> create table empinfo
  2    (name       varchar2(20),
  3     mobile_no  varchar2(20),
  4     service    varchar2(20),
  5     --
  6     data_insert_time varchar2(20) default 'EMPLOYEE-' || to_char(sysdate, 'yyyymmdd')
  7    );

Table created.

SQL> insert into empinfo (name) values ('Littlefoot');

1 row created.

SQL> select * from empinfo;

NAME                 MOBILE_NO            SERVICE              DATA_INSERT_TIME
-------------------- -------------------- -------------------- --------------------
Littlefoot                                                     EMPLOYEE-20210319

SQL>
 

В SQL*Loader вы бы загрузили все столбцы, кроме data_insert_time .


Если это должен быть загрузчик SQL*, то:

Таблица образцов:

 SQL> create table empinfo
  2    (name       varchar2(20),
  3     mobile_no  varchar2(20),
  4     service    varchar2(20),
  5     --
  6     data_insert_time varchar2(20)
  7    );

Table created.
 

Контрольный файл:

 load data 
infile *
replace
into table empinfo
fields terminated by "," 
trailing nullcols
(
name,
mobile_no,
service,
data_insert_time "'EMPLOYEE-' || to_char(sysdate, 'yyyymmdd')"
)

begindata
Littlefoot,12345678,IT
Jack,005492906405,IT
 

Тестирование:

 SQL> $sqlldr scott/tiger@orcl control=test33.ctl log=test33.log

SQL*Loader: Release 11.2.0.1.0 - Production on Pet O×u 19 07:54:12 2021

Copyright (c) 1982, 2009, Oracle and/or its affiliates.  All rights reserved.

Commit point reached - logical record count 1
Commit point reached - logical record count 2

SQL> set linesize 100
SQL> select * from empinfo;

NAME                 MOBILE_NO            SERVICE              DATA_INSERT_TIME
-------------------- -------------------- -------------------- --------------------
Littlefoot           12345678             IT                   EMPLOYEE-20210319
Jack                 005492906405         IT                   EMPLOYEE-20210319

SQL>
 

Если вы хотели фактически загрузить имя сотрудника (а не EMPLOYEE саму строку), измените файл управления на

 data_insert_time ":name ||'-'|| to_char(sysdate, 'yyyymmdd')"
 

и в результате получается

 NAME                 MOBILE_NO            SERVICE              DATA_INSERT_TIME
-------------------- -------------------- -------------------- --------------------
Littlefoot           12345678             IT                   Littlefoot-20210319
Jack                 005492906405         IT                   Jack-20210319