我想将平面文件加载到oracle数据库中。该平面文件可以从表A或表B或表C生成。
因此,当我将此文件加载到oracle表中时,我完全不确定该列具有多少列以及该平面文件具有的数据类型(取决于它是从表A还是表B或表C生成)
所以,请让我知道将变量列长度文件加载到oracle数据库的通用方法,技术。
示例:
表A
1 | 2 | 3 | 4
表B
1 | XYZ | 3 | 4 | 5 | XXX
表3
xxx | 2013-09-28 | 10.0
因此,这里每个表都有可变列和不同的数据类型。如何将这些文件加载到oracle数据库中。
提前致谢。
答案 0 :(得分:0)
一种选择是使用SQLLoader将文件加载到表中。
假设我们创建了三个表:
CREATE TABLE tableA(
col1 int, col2 int, col3 int, col4 int
);
CREATE TABLE tableB(
col1 int, col2 varchar2(100), col3 int, col4 int, col5 int, col6 varchar2(100)
);
CREATE TABLE tableC(
col1 varchar2(100), col2 date, col3 number(10,2)
);
我假设文件始终只以一种格式记录(3种可能的格式之一)
在这种情况下,您可以为每种格式创建3个不同的控制文件:
的 format_a.ctl 强>
load data
infile 'c:\tmp\test\file.txt'
into table tableA
fields terminated by "|"
( col1, col2, col3, col4 )
<强> format_b.ctl 强>
load data
infile 'c:\tmp\test\file.txt'
into table tableB
fields terminated by "|"
( col1, col2, col3, col4, col5, col6 )
<强> format_c.ctl 强>
infile 'c:\tmp\test\file.txt'
into table tableC
fields terminated by "|"
( col1 ,
col2 date 'yyyy-mm-dd',
col3 )
然后创建一个简单的脚本来检测文件的格式并使用适当的控制文件上传数据 - 这是Windows环境的一个示例:
@echo off
set filename=file.txt
IF NOT EXIST %filename% GOTO error
findstr /M "\|.*\|.*\|.*\|.*\|" file.txt
IF NOT ERRORLEVEL 1 GOTO formatB
findstr /M "\|.*\|.*\|" file.txt
IF NOT ERRORLEVEL 1 GOTO formatA
findstr /M "\|.*\|" file.txt
IF NOT ERRORLEVEL 1 GOTO formatC
:error
Echo Error: file %filename% doesn't exist or doesn't match any proper format
goto end
:formatA
set ctl_file=format_a
goto import
:formatB
set ctl_file=format_b
goto import
:formatc
set ctl_file=format_c
goto import
:import
echo Import using: %ctl_file%
sqlldr test/test@//192.168.2.51:1521/orcl control=%ctl_file%.ctl log=%ctl_file%.log
:end
在这一行:
sqlldr test/test@//192.168.2.51:1521/orcl control=%ctl_file%.ctl log=%ctl_file%.log
test / test @是具有密码test
test