我认为WHEN部分有可能,但找不到有关它的文档。控制文件:
load data INFILE 'C:\Users\Acer\Desktop\oracle-18\info.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
)
答案 0 :(得分:0)
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 * Loader控制文件:
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 Loader能够将其转换为有用的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
),因此我将对{{1} }命令:
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>
语句:
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>
子句结果:
WHERE
毕竟,基本上是一个非常简单的任务。