如何从SQL加载器加载当前月份记录?



我认为 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 TABLEINSERT 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>

毕竟,基本上是一项非常简单的任务。

最新更新