Oracle中的大容量加载UDT列
我有一个具有以下结构的表:Oracle中的大容量加载UDT列,oracle,csv,sql-loader,Oracle,Csv,Sql Loader,我有一个具有以下结构的表: create table my_table ( id integer, point Point -- UDT made of two integers (x, y) ) 我有一个包含以下数据的CSV文件: #id, point 1|(3, 5) 2|(7, 2) 3|(6, 2) 现在我想将这个CSV批量加载到我的表中,但是我找不到关于如何在Oraclesqlldrutil中处理UDT的任何信息。有UDT列时是否可以使用批量加载util?我不知道s
create table my_table (
id integer,
point Point -- UDT made of two integers (x, y)
)
我有一个包含以下数据的CSV文件:
#id, point
1|(3, 5)
2|(7, 2)
3|(6, 2)
现在我想将这个CSV批量加载到我的表中,但是我找不到关于如何在Oracle
sqlldr
util中处理UDT的任何信息。有UDT列时是否可以使用批量加载util?我不知道sqlldr是否可以做到这一点,但我个人会使用外部表
将该文件作为外部表附加(该文件必须位于数据库服务器上),然后将外部表的内容插入到目标表中,将UDT转换为两个值。以下“从双重选择”将有助于您进行翻译:
select
regexp_substr('(5, 678)', '[[:digit:]]+', 1, 1) x_point,
regexp_substr('(5, 678)', '[[:digit:]]+', 1, 2) y_point
from dual;
更新
在sqlldr中,可以使用标准SQL表达式转换字段:
LOAD DATA
INFILE 'data.dat'
BADFILE 'bad_orders.txt'
APPEND
INTO TABLE test_tab
FIELDS TERMINATED BY "|"
( info,
x_cord "regexp_substr(:x_cord, '[[:digit:]]+', 1, 1)",
)
上面的控制文件将提取(3,4)等字段中的第一个数字,但我找不到提取第二个数字的方法-即我不确定是否可以将输入文件中的相同字段插入两列
如果您不能选择外部表,我建议您(1)在加载之前使用sed、awk、Perl等转换文件,或者(2)使用SQLLDR将文件转换为临时表,然后使用第二个过程转换数据格式并插入到最终表中。另一个选项是查看文件是如何生成的-您能否生成它,以便需要转换的字段在文件中的两个字段中重复,例如:
data|(1, 2)|(1, 2)
也许其他人会插手一种让sqlldr做你想做的事情的方法。经过更多的研究后解决了这个问题,因为Oracle SQL*Loader有这个功能,它通过指定一个
列对象来使用,解决方案如下:
LOAD DATA
INFILE *
INTO TABLE my_table
FIELDS TERMINATED BY "," OPTIONALLY ENCLOSED BY '"'
TRAILING NULLCOLS
(
id,
point column object
(
x,
y
)
)
BEGINDATA
1,3,5
2,7,2
3,6,2
不幸的是,这不是一个选项!我的模式正在生产中,给出的示例是一个非常简单的示例,只是为了给出问题的想法!