我正在尝试使用sqlloader将数据加载到Oracle数据库中, 我的数据如下所示。 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10
我不想将第一列和最后一列加载到表中, 我想将2 | 3 | 4 | 5 | 6 | 7 | 8 | 9加载到一个字段中。 我试图加载的表只有一个名为'field1'的文件。
如果有人有这种经历,你能提出一些建议吗? 我试过BOUNDFILLER,FILLER等等,我无法做到。 帮我。 :)
答案 0 :(得分:0)
将文件中的整行加载到BOUNDFILLER中,然后将所需的部分提取到列中。您必须告诉sqlldr该字段由回车符/换行符(假设是Windows操作系统)终止,因此它将从文件中读取整行作为一个字段。在这里,文件中的整行被读入" dummy"作为BOUNDFILLER。 "虚设"与列名称不匹配,无论如何它都被定义为BOUNDFILLER,因此整行都记得"记住"。控制文件中的下一行以与列名匹配的列开始,因此sqlldr尝试执行表达式。它从已保存的"虚拟"中提取子字符串。并把它放入" 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
决定哪个更易于维护取决于您。想想你之后的开发人员,无论如何评论! : - )