暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle SQL * Loader将文件名保存到表列中

askTom 2017-07-11
492

问题描述

我需要将不同的csv文件导入到1个表中。我需要使用sqlloader。(Oracle版本12.1.0.2) 这是我的控制文件:

load data 
append
into table SAMP_TABLE
fields terminated by ','
OPTIONALLY ENCLOSED BY '"' AND '"'
trailing nullcols
           ( 
             INSERT_DATE EXPRESSION "current_timestamp(3)",
             FILE_NAME CHAR(4000),
             COLUMN1 CHAR(4000)
             COLUMN2 CHAR(4000)
           )

这是我的批处理文件 (我需要在windows机器中执行此操作):

@echo off
IF NOT EXIST C:\Users\test\csvFiles
IF NOT EXIST C:\Users\test\logfiles
for %%F in ("C:\Users\test\*.csv") do (
SET tmpFile=%%F
SET newFile=%tmpFile:~0,-3%.log
sqlldr db_user/db_pw@db_ip CONTROL='C:\Users\test.ctl' LOG='C:\Users\logfiles\%newFile%' "DATA=%%F" skip=1
move %%F C:\Users\test\csvFiles
)
pause  

它所做的是,它在开始时创建2个文件夹: “csvFiles” (在加载后将csv文件移动到此文件夹) 和 “logfiles” (移动创建的日志文件)。(使用DATA = % % F,我可以将csv文件传递给控制文件)

您可以看到我的控制文件上的前2列是 “插入日期”,它插入了current_timestamp和 “FILE_NAME”。

现在我的问题是,我不知道如何将csv文件 (将被加载) 的文件名传递给控制文件。我希望每个导入csv文件都将此csv文件的文件名插入此列。我搜索了一些解决方案,但其中一些是在UNIX中,但是我需要在Windows中进行。

如果有人可以帮助我,我将不胜感激,因为我对批处理脚本或一般脚本不是很熟悉。

提前感谢

专家解答

我不知道在SQL * Loader中获取文件名并将其作为列传递的方法。所以这里有几个选择:

-将文件名添加到文件中的每一行。
-将文件名声明为一列的常量:

FILE_NAME CHAR(4000) constant 'file'


然后每次在调用脚本之前找到/替换它。

我也不是视窗脚本专家。但这给出了替换文件中的文本的几种解决方案:

https://stackoverflow.com/questions/60034/how-can-you-find-and-replace-text-in-a-file-using-the-windows-command-line-envir

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论