#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