Oracle PL-SQL:将多个分隔文件导入到表中

Oracle PL-SQL:将多个分隔文件导入到表中,sql,oracle,parsing,plsql,delimited,Sql,Oracle,Parsing,Plsql,Delimited,我有多个文件(f1.log、f2.log、f3.log等) 每个文件都有中的数据&=分隔格式。(新行由分隔;和字段由=分隔)例如 f1数据: 1=a;2=b;3=c f2的数据: 1=p;2=q;3=r 我需要读取所有这些文件并以以下格式将数据导入表: filename number data f1 1 a f1 2 b f1 3 c f2 1 p [...] 我是SQL新手

我有多个文件(f1.log、f2.log、f3.log等) 每个文件都有
中的数据&
=
分隔格式。(新行由
分隔;
和字段由
=
分隔)例如

f1数据:

1=a;2=b;3=c
f2的数据:

1=p;2=q;3=r
我需要读取所有这些文件并以以下格式将数据导入表:

filename  number  data

f1        1       a

f1        2       b

f1        3       c

f2        1       p
[...]
我是SQL新手。你能告诉我怎么做吗?

使用将文件放入表格中。假设您创建的表有点像:

create table FLOG
(
  FILENAME   varchar2(1000)
 ,NUM        varchar2(1000)
 ,DATA       varchar2(1000)
);
然后可以使用以下控制文件:

LOAD DATA
INFILE 'f1.log' "str ';'"
truncate INTO TABLE flog
fields terminated by '=' TRAILING NULLCOLS
(
   filename constant 'f1'
   ,num  char 
   ,data char 
)
但是,每个文件都需要不同的控制文件。这可以通过使用shell脚本动态生成控制文件来实现。示例shell脚本可以是:

cat >flog.ctl <<_EOF
LOAD DATA
INFILE '$1.log' "str ';'"
APPEND INTO TABLE flog
fields terminated by '=' TRAILING NULLCOLS
(
filename constant '$1'
,num  char
,data char
)
_EOF

sqlldr <username>/<password>@<instance> control=flog.ctl data=$1.log

你在寻找sqlldr控制文件语法吗?亲爱的约翰,非常感谢你的回答。我有两个问题:1)放置“str”的目的是什么“在填充后?2)我不能使用shell脚本,因为我这里只有窗口。我如何为我正在分析的每个数据文件生成动态控制文件?我想到在过程中后台处理文件。但这是不可能的,因为后台处理不能在过程中完成。3)如果在执行sqlldr时,我们使用'data='选项,我们是否有是否在ctl文件中使用infle子句?据我所知,它们都有相同的用途“
表示
是记录分隔符,而不是换行符(
str
代表
)由于这个原因,
infle
行仍然是需要的,尽管文件名部分现在是多余的,因为
data=
命令行选项将始终覆盖那里的内容。但是文件名仍然需要放在
infle
之后-尽管你可以使用任何名称。我对Windows批处理文件不太熟悉,所以我e问了另一个问题,看看我的脚本是否可以转换。亲爱的John,非常感谢您的帮助。实际上,我的要求有点不同。我有blob数据,它的格式是文件f1,f2,如上所述。我的代码如下所示:
for loop--下面调用的过程生成文本文件f1.log,f2.log
proc\u to_read_blob(filename)/*将文件f1.log、f2.log中的数据加载到DB table中的代码*/proc_to_pars_文件(filename)end for loop
我不希望使用批处理或shell脚本,因为我希望使此代码对不同的操作系统通用。不确定在这种情况下如何使用sqlldr:(对于格式错误,我深表歉意。我可能多次尝试更正它,但它似乎无法在我的本地计算机上运行。
./flog.sh f1
./flog.sh f2