Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle中的大容量加载UDT列_Oracle_Csv_Sql Loader - Fatal编程技术网

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

不幸的是,这不是一个选项!我的模式正在生产中,给出的示例是一个非常简单的示例,只是为了给出问题的想法!