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

时间:2019-12-22 22:58:41

标签: sql oracle sql-loader

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

1 个答案:

答案 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 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),因此我将对{{1} }命令:

CREATE TABLE

我修改了以下行:

  • 1-重命名了表格
  • 10和14-重命名目录

在其下面(在日志文件中),您将看到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

我修改了以下行:

  • 11-固定的外部表名称
  • 12-我自己写了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

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