空间数据库课程设计报告 chapter-5
第5章 空间数据的加载、传输和验证
一、 向SDO_GEOMETRY列中插入数据
新建一个sales_regions表,向表中插入一个多边形几何体,运用前面学过的SDO_GEOMETRY数据类型。SQL语句如下:
程序5—1
CREATE TABLE sales_regions (
id NUMBER, geom SDO_GEOMETRY );
把表示销售区域的多边形插入到这表中的geom列中,SQL语句如下:
程序5-2
INSERT INTO sales_regions VALUES (
10000, -- SALES_REGIONS ID
SDO_GEOMETRY -- use the SDO_GEOMETRY constructor (
2003, -- A two-dimensional Polygon 8307, -- SRID is GEODETIC
NULL, -- SDO_POINT_TYPE is null as it is not a point SDO_ELEM_INFO_ARRAY (1, 1003, 1), -- A polygon with just one ring SDO_ORDINATE_ARRAY -- SDO_ORDINATES field (
-77.04487, 38.9043742, -- coordinates of first vertex -77.046645, 38.9040983, -- other vertices -77.04815, 38.9033127, -77.049155, 38.9021368,
-77.049508, 38.9007499, -77.049155, 38.899363, -77.048149, 38.8981873, -77.046645, 38.8974017, -77.04487, 38.8971258, -77.043095, 38.8974017, -77.041591, 38.8981873, -77.040585, 38.899363, -77.040232, 38.9007499, -77.040585, 38.9021368, -77.04159, 38.9033127, -77.043095, 38.9040983, -77.04487, 38.9043742 -- coordinates of last vertex same as first vertex ) )
空间数据库课程设计报告 chapter-5
);
二、 加载和转换空间数据
(一) 用SQL*Loader从文本文件加载
SQL*Loader是Oracle的一个工具,用于从文件向Oracle表加载数据,可以执行批量加载。SQL*Loader由控制文件和数据组成,控制文件定义了数据的格式,怎样把文件数据分解成Oracle中的行,以及怎样把这些行分解为不同的列。数据可以在同一个控制文件的BEGINDATA关键字之后被指定,也可以存储在一个独立文件里。
加载点数据时,不需要指定SDO_SRID、SDO_ELEM_INFO_ARRAY和SDO_ORDONATE_ARRAY组件,它们将被自动设为NULL。程序5-3是将点数据插入geom列中,数据在控制文件中被指定:
程序5-3
LOAD DATA INFILE *
INTO TABLE sales_regions APPEND
FIELDS TERMINATED BY '|' TRAILING NULLCOLS (
id NULLIF ID = BLANKS, geom COLUMN OBJECT (
SDO_GTYPE INTEGER EXTERNAL, SDO_POINT COLUMN OBJECT (
X FLOAT EXTERNAL, Y FLOAT EXTERNAL ) ) )
空间数据库课程设计报告 chapter-5
BEGINDATA
1|2001|-76.99022|38.888654| 2|2001|-77.41575|38.924753| 将该文件用DOS导入,
插入了数据,
也可将控制文件和数据文件分开,在命令行中指定这个文件,如程序5-6是控制文件,程序5-7是数据文件,DOS中的语句改为程序5-5:
程序5-6
LOAD DATA
INFILE sales_regions.dat INTO TABLE sales_regions APPEND
FIELDS TERMINATED BY '|' TRAILING NULLCOLS (
id NULLIF ID = BLANKS, geom COLUMN OBJECT (
SDO_GTYPE INTEGER EXTERNAL, SDO_POINT COLUMN OBJECT (
X FLOAT EXTERNAL, Y FLOAT EXTERNAL ) ) )
程序5-7
空间数据库课程设计报告 chapter-5
1|2001|-76.99022|38.888654| 2|2001|-77.41575|38.924753|
程序5-5
SQLLDR spatial/spatial CONTROL=sales_regions.ctl DATA=sales_region.dat 这样和程序5-3的功能是相同的。
加载非点数据时,需要填充SDO_GEOMETRY中的SDO_ELEM_INFO域和SDO_ORDINATES域,如程序5-8:
程序5-8
LOAD DATA INFILE *
CONTINUEIF NEXT(1:1)='#' INTO TABLE sales_regions APPEND
FIELDS TERMINATED BY '|' TRAILING NULLCOLS (
id CHAR(6), geom COLUMN OBJECT (
SDO_GTYPE INTEGER EXTERNAL, SDO_SRID INTEGER EXTERNAL,
SDO_ELEM_INFO VARRAY terminated by '/' (E FLOAT EXTERNAL), SDO_ORDINATES VARRAY terminated by '/' (O FLOAT EXTERNAL) ) ) BEGINDATA
10000| 2003| 8307| #1| 1003| 1|/
#-77.04487| 38.9043742| -77.046645| 38.9040983| -77.04815| 38.9033127|-77.049155| #38.9021368| -77.049508| 38.9007499| -77.049155| 38.899363| -77.048149| #38.8981873| -77.046645| 38.8974017| -77.04487| 38.8971258| -77.043095| #38.8974017| -77.041591| 38.8981873| -77.040585| 38.899363| -77.040232| #38.9007499| -77.040585| 38.9021368| -77.04159| 38.9033127| -77.043095| #38.9040983| -77.04487| 38.9043742| -77.04487| 38.9043742|/
空间数据库课程设计报告 chapter-5
如果数据被包含在控制文件中,SQL*Loader就不能处理多于64K的数据,为了变通解决这个限制,记录可被分割成多行,如果每行的首字母以“#”开始,记录就是连续的。 (二) 在Oracle数据库之间传输空间数据
加载数据最简单的方式是使用独立于Qracle平台的.dmp文件,这种文件被Oracle的Import/Export实用工具所使用,如程序5-9是从spatial模式中导出customers表:
程序5-9
EXP spatial/spatial FILE=customers.dmp TABLES=customers
使用Oracle Import实用工具这个.dmp文件导入到scott模式中,如程序5-10:
程序5-10
IMP scott/tiger FILE=customers.dmp IGNORE=Y TABLES=CUSTOMERS
也可以用fromuseer和touser命令行参数向scott模式中导入数据,导入的命令是以系统账户(system/manager)来运行的,如程序5-11:
程序5-11