如何使用带跳过和合并列的SQL Loader将数据加载到Oracle中?

如何使用带跳过和合并列的SQL Loader将数据加载到Oracle中?,oracle,sql-loader,Oracle,Sql Loader,我正在尝试使用sqlloader将数据加载到Oracle数据库中, 我的数据如下所示。 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 我不想将第一列和最后一列加载到表中, 我想将2 | 3 | 4 | 5 | 6 | 7 | 8 | 9加载到一个字段中。 我试图加载到的表只有一个名为“field1”的字段 如果有人有这种经验,你能给些建议吗? 我试过填充物,填充物等等,我做不到。 帮帮我。:) 将文件中的整行加载到BOUNDFILLER中,然后将需要的部分提取到列

我正在尝试使用sqlloader将数据加载到Oracle数据库中, 我的数据如下所示。 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10

我不想将第一列和最后一列加载到表中, 我想将2 | 3 | 4 | 5 | 6 | 7 | 8 | 9加载到一个字段中。 我试图加载到的表只有一个名为“field1”的字段

如果有人有这种经验,你能给些建议吗? 我试过填充物,填充物等等,我做不到。
帮帮我。:)

将文件中的整行加载到BOUNDFILLER中,然后将需要的部分提取到列中。您必须告诉sqlldr该字段由回车符/换行符终止(假设为Windows操作系统),以便它将文件中的整行作为一个字段读取。在这里,文件中的整行作为BOUNDFILLER读入“dummy”。“dummy”与列名不匹配,而且它被定义为BOUNDFILLER,因此整行都被“记住”。控制文件中的下一行以与列名匹配的列开始,因此sqlldr尝试执行表达式。它从保存的“dummy”中提取一个子字符串,并将其放入“col_a”列

简而言之,正则表达式返回字符串中位于第一个管道之后但不包括该管道的部分,以及位于最后一个管道之前但不包括该管道的部分。请注意双反斜杠。无论如何,在我的环境中,当使用反斜杠删除管道的特殊含义(在方括号之间不需要)时,它在从sqlldr传递到正则表达式引擎时被剥离,因此控制文件中需要两个反斜杠 (通常管道符号是一个逻辑OR)因此最终可以通过。如果您在这里遇到问题,请尝试一个反斜杠,看看会发生什么。猜猜我花了多长时间才弄明白

load data 
infile 'x_test.dat' 
TRUNCATE
into table x_test
FIELDS TERMINATED BY x'0D0A'
(
 dummy BOUNDFILLER,
 col_a expression "regexp_substr(:dummy, '[^|]*\\|(.+)\\|.*', 1, 1, NULL, 1)"
)
编辑:使用此选项测试正则表达式。例如,如果末端有一个附加管道:

select regexp_substr('1|2|3|4|5|6|7|8|9|10|', '[^|]*\|(.+)\|.*\|', 1, 1, NULL, 1)
from dual;
第二次编辑:对于那些不熟悉正则表达式的人,此方法使用嵌套的SUBSTR和INSTR函数:

SQL> with tbl(str) as (
     select '1|2|3|4|5|6|7|8|9|10|' from dual
   )
   select substr(str, instr(str, '|')+1, (instr(str, '|', -1, 2)-1 - instr(str
, '|')) ) after
   from tbl;

AFTER
---------------
2|3|4|5|6|7|8|9

决定哪个更容易维护取决于您。在你之后想想开发人员,无论如何都要发表评论!:-)

这是非常有用的,如果在行的末尾有|像1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |,我现在不习惯正则表达式不过,我想我最终还是能弄明白的。:)非常感谢你友好的回答!!现在您的规格正在更改。在使用正则表达式之前,您需要知道将要使用的数据。无论如何,请看我的编辑。这仍然包括10个,如“2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10”。我想做的是‘2 | 3 | 4 | 5 | 6 | 7 | 8 | 9’:)对不起,对不起..当运行时,我得到
2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
。请注意正则表达式已更改。如果你把它放在你的控制文件中,也许会加上双斜杠?:)你是对的,它工作得很好!!多谢各位