我有许多文件包含大量的Insert语句(由Toad for Oracle生成),我需要在Postgresql数据库上运行。
听起来很简单我知道但是也有oracle特定的空间数据类型阻碍了我的努力。我尝试使用一些工具从SwisSQL到SDO2Shp来迁移数据并且没有任何帮助,所以我唯一的计划是尝试提出一个C#程序打开文件,替换oracle特定类型使用将在postgis中工作的类型,然后再次保存文件。问题是我不知道我可以用Oracle替换哪些类型或我必须使用的格式或语法。
我是postgresql和postgis的新手,我的oracle知识也有限,因为我之前使用的是SQL Server。
以下是Insert语句的示例。它们都具有相同的格式,因为表格相同但在地图上具有不同缩放级别的不同数据。
Insert into CLUSTER_1000M
(CLUSTER_ID, CELL_GEOM, CELL_CENTROID)
Values
(4410928,
"MDSYS"."SDO_GEOMETRY"(2003,81989,NULL,
"MDSYS"."SDO_ELEM_INFO_ARRAY"(1,1003,3,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),
"MDSYS"."SDO_ORDINATE_ARRAY"(80000,106280,81000,107280,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL)),
"MDSYS"."SDO_GEOMETRY"(2001,81989,
"MDSYS"."SDO_POINT_TYPE"(80500,106780,NULL),NULL,NULL));
如何将其转换为适用于postgis的格式?
答案 0 :(得分:1)
我不知道Oracle GIS实现的工作原理:
但是看看这些数据,我认为转换是不可能的(可能是,但努力可能很大)。
的方式INSERT INTO geotable ( the_geom, the_name )
VALUES ( ST_GeomFromText('POINT(-126.4 45.32)', 312), 'A Place');
PostGIS遵循standards关于如何显示/存储数据的方法,并提供方法可以帮助开发人员这样做。此转化主要是with functions,其名称中包含*from*
。因此,要从line创建正确的数据,输出类似于aline
SELECT ST_LineFromWKB(ST_AsBinary(ST_GeomFromText('LINESTRING(1 2, 3 4)'))) AS aline,
ST_LineFromWKB(ST_AsBinary(ST_GeomFromText('POINT(1 2)'))) IS NULL AS null_return;
aline | null_return
------------------------------------------------
010200000002000000000000000000F ... | t
从您的Oracle示例输出来看,格式非常不同,可能无法转换(如果Oracle不能提供符合标准的内容)。
另一方面,在查看Oracle example
时INSERT INTO cola_markets VALUES(
1,
'cola_a',
SDO_GEOMETRY(
2003, -- two-dimensional polygon
NULL,
NULL,
SDO_ELEM_INFO_ARRAY(1,1003,3), -- one rectangle (1003 = exterior)
SDO_ORDINATE_ARRAY(1,1, 5,7) -- only 2 points needed to
-- define rectangle (lower left and upper right) with
-- Cartesian-coordinate data
)
);
您可以将一些Oracle名称替换为PostGIS的名称,因此SDO_ORDINATE_ARRAY(1,1, 5,7)
可能会变成ST_GeomFromText(LINESTRING(1 1, 5 7))