在Oracle数据库中使用SQL*Loader插入几何图形?

r1zhe5dt  于 2023-04-11  发布在  Oracle
关注(0)|答案(1)|浏览(123)

我在Oracle中有一个表,格式如下:

create table MY_USER.MY_TABLE(
    POINT                   SDO_GEOMETRY,
    "date"                  TIMESTAMP(6),
    DEVICE                  NUMBER(10)
)

现在我想使用SQL*Loader在这个表中插入数据。我的问题主要是SDO_GEOMETRY列。我想快速执行此插入,例如在不到500毫秒的时间内插入5000个数据。
我试过这个控制文件,它没有错误,但它是如此耗时(它花了近2秒插入5000行):

options(skip=1)
load data
infile '/path/data.csv'
append into table MY_USER.MY_TABLE
fields terminated by ',' optionally enclosed by '"'
TRAILING NULLCOLS (
    point COLUMN OBJECT (
         SDO_GTYPE,
         SDO_SRID,
         SDO_POINT COLUMN OBJECT (
            X  INTEGER EXTERNAL,
            Y  INTEGER EXTERNAL
         )
    ),
    "date"  TIMESTAMP 'YYYY-MM-DD HH24:MI:SS.FF',
    device  INTEGER EXTERNAL,
)

我的数据文件是这样的:

sdo_gtype, sdo_srid, x, y, date, device 
2001,3857,10000,10000,2023-04-10 16:00:00.000,100000

正如我所说的,这个方法工作得很好,但它太慢了。我认为直接使用SDO_GEOMETRY构造函数,性能会更好。所以我尝试在我的控制文件中做这样的事情:(我也从我的数据文件中省略了2001和3857)

...
point "SDO_GEOMETRY(2001, 3857, SDO_POINT_TYPE(:x, :y, NULL), NULL, NULL)",
...

但是这种方法不起作用,并且指出POINT列的数据类型不正确。
有没有人有任何想法或经验,可以帮助我?我想一个快速的方法来插入大量的数据到我的表。我想在Oracle的PostgreSQL COPY命令类似的东西。

eqzww0vc

eqzww0vc1#

如果要使用PLSQL插入,并且Oracle版本为Oracle 10g或更高版本,则可以使用BULK COLLECT INTO,而要插入DML,则可以使用FOR ALL
请参阅此博客作为参考:https://blogs.oracle.com/connect/post/bulk-processing-with-bulk-collect-and-forall

相关问题