我在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
命令类似的东西。
1条答案
按热度按时间eqzww0vc1#
如果要使用PLSQL插入,并且Oracle版本为Oracle 10g或更高版本,则可以使用
BULK COLLECT INTO
,而要插入DML,则可以使用FOR ALL
。请参阅此博客作为参考:https://blogs.oracle.com/connect/post/bulk-processing-with-bulk-collect-and-forall