我认为 WHEN 部分有什么可能,但找不到有关它的文档。控制文件:
load data INFILE 'C:UsersAcerDesktoporacle-18info.txt'
REPLACE INTO TABLE lab18
FIELDS TERMINATED BY ';'
(
integervalue "round(:integervalue, 2)",
charvalue "upper(:charvalue)",
datevalue date "YYYY-MM-DD" /////need to load data with current month
)
>WHEN
子句是你要找的,但是 - 你不能在其中使用任何函数,所以你必须切换到其他东西。正如@Tejash评论的那样,外部表是一个 - 实际上是一个很好的选择 - 一个。
这是一个演练,看看是否有帮助。
要设置此会话的默认数据格式,请执行以下操作:
SQL> alter session set nls_date_format = 'dd.mm.yyyy';
Session altered.
SQL>
输入数据,存储在lab18.txt
中(前两行属于当前月份,即 2019 年 12 月,只有这两行应加载到lab18
表中(:
100.556;Little;2019-12-23
20.976;Foot;2019-12-20
76.23;Michael;2019-11-25
20.2;Scott;2019-07-13
目标表:
SQL> desc lab18
Name Null? Type
----------------------------------------- -------- ----------------------------
INTEGERVALUE NUMBER
CHARVALUE VARCHAR2(10)
DATEVALUE DATE
SQL>
SQL*加载程序控制文件:
LOAD DATA
infile lab18.txt
replace
INTO TABLE lab18
FIELDS TERMINATED BY ';'
TRAILING NULLCOLS
(
integervalue "round(replace(:integervalue, '.', ','), 2)",
charvalue "upper(:charvalue)",
datevalue "to_date(:datevalue, 'yyyy-mm-dd')"
)
如果我们不使用 SQL Loader,为什么我需要它?因为我们在创建它时付出了一些努力,并且 SQL加载程序能够将其转换为有用的CREATE TABLE
和INSERT INTO
脚本。方法如下:注意external_table=generate_only
,因为它会将这些有用的语句放入日志文件中。
SQL> $sqlldr scott/tiger control=test14.ctl external_table=generate_only
SQL*Loader: Release 11.2.0.2.0 - Production on Pon Pro 23 11:17:00 2019
Copyright (c) 1982, 2009, Oracle and/or its affiliates. All rights reserved.
SQL>
现在,编辑日志文件并提取我们感兴趣的命令。由于我已经有一个目录(名为EXT_DIR
(,我将稍微修改CREATE TABLE
命令:
SQL> CREATE TABLE EXT_LAB18
2 (
3 "INTEGERVALUE" VARCHAR(4000),
4 "CHARVALUE" VARCHAR(4000),
5 "DATEVALUE" VARCHAR(4000)
6 )
7 ORGANIZATION external
8 (
9 TYPE oracle_loader
10 DEFAULT DIRECTORY EXT_DIR
11 ACCESS PARAMETERS
12 (
13 RECORDS DELIMITED BY NEWLINE CHARACTERSET EE8MSWIN1250
14 BADFILE 'EXT_DIR':'lab18.bad'
15 LOGFILE 'test14.log_xt'
16 READSIZE 1048576
17 FIELDS TERMINATED BY ";" LDRTRIM
18 MISSING FIELD VALUES ARE NULL
19 REJECT ROWS WITH ALL NULL FIELDS
20 (
21 "INTEGERVALUE" CHAR(255)
22 TERMINATED BY ";",
23 "CHARVALUE" CHAR(255)
24 TERMINATED BY ";",
25 "DATEVALUE" CHAR(255)
26 TERMINATED BY ";"
27 )
28 )
29 location
30 (
31 'lab18.txt'
32 )
33 )REJECT LIMIT UNLIMITED;
Table created.
SQL>
我修改了台词:
- 1 - 重命名表
- 10 和 14 - 重命名目录
在其下方(在日志文件中(,您将看到INSERT INTO
语句:
SQL> INSERT /*+ append */ INTO LAB18
2 (
3 INTEGERVALUE,
4 CHARVALUE,
5 DATEVALUE
6 )
7 SELECT
8 round(replace("INTEGERVALUE", '.', ','), 2),
9 upper("CHARVALUE"),
10 to_date("DATEVALUE", 'yyyy-mm-dd')
11 FROM EXT_LAB18
12 WHERE to_char(to_date(datevalue, 'yyyy-mm-dd'), 'mm.yyyy') = to_char(sysdate, 'mm.yyyy');
2 rows created.
SQL>
我修改了台词:
- 11 - 固定外部表名
- 12 - 我自己写了
WHERE
条款
结果:
SQL> commit;
Commit complete.
SQL> select * From lab18;
INTEGERVALUE CHARVALUE DATEVALUE
------------ ---------- ----------
100,56 LITTLE 23.12.2019
20,98 FOOT 20.12.2019
SQL>
毕竟,基本上是一项非常简单的任务。