0

我想将一个平面文件加载到 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 数据库中。

提前致谢。

4

1 回答 1

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 )

格式_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

于 2013-09-29T09:39:20.560 回答