一 前言

    以往公司开发的地理信息系统数据都是存储在oracle中,然而在地图数据的分析和计算中一直存在不小的问题,所以今次我们尝试使用PostgreSQL+PostGIS来解决这一问题。

    本篇笔记的目的就是记录在研究这一开发路径期间的“学习的内容”、“遇到的问题和解决过程”以及“简单的实践内容”以备忘。

    笔记中可能会出现部分术语概念不准确,还请您能耐心指正或者忽略,反正这是为了我自己能看懂的笔记,你爱看不看。

二 安装

  1.环境

    Windows7 64位操作系统(公司工作的台式机,探索阶段暂时使用,以后可能会转到Windows系统的服务器上去)。

    已安装了Oracle 11g客户端,这里将不在介绍oracle的安装。

  2.步骤

    基本还是准寻下一步原则,第二步注意一下语言的选择。

 

    SQL安装完毕后自动弹出Stack Builder引导安装PostGIS等其他扩展。

    我这里只选择了自己需要的PostGIS版本进行了安装。

    详细可以参考同事整理的安装文档:https://www.jianshu.com/p/3b1a4cd8e72e

三 遇到的第一个问题

  前一天用着好好的数据库,第二天服务就死活链接不上了,而且在pgAdime里没有报任何错误,就很奇怪。

  在尝试了修改配置文件、分析服务管理器启动产生的日志等最终还是没有奏效,索性卸载干净重新安装,居然就好了。。。

  现在仔细想想可能是头一天尝试各种配置文件,把整个配置搞毁了,还有就是真有一些奇怪的bug。不过这里吸取了一个教训就是,在还没有做太多工作的前提下,百度多次都没有明确解决办法的时候,还不如从头来过

  不过这里还是有一些未解决的小问题,就是postgreSQL的日志文件里的错误记录时不时就有乱码,而且不是所有中文都乱码,而是部分报错的记录才乱码,非常的诡异。这个以后要解决一下。

四 Oracle_fdw的安装部署

  4.1 下载地址

    选择自己合适的版本下载,然后解压。

  4.2 部署

 

                                                            图1

 

                                                            图2

    图1是解压后的文件,将文件夹内文件复制到postgresql安装指定目录中(图2)。

    在postgresql控制台中输入

 

create extension oracle_fdw;

 

    部署成功!

    这里我遇到过的问题是总提示oracle_fdw不是有效的win32程序,因为我的系统是64位系统,PostgreSQL选择安装的是64位,oracle_fdw自然选择的也是64位,为什么会提示不是有效的32位程序呢?

    百度一圈也么有找到和我相同的问题,只能自己解决,尝试换32位oracle也未果。

    不过后来发现我的oracle客户端安装的是32位,抱着试试看的态度,只能又卸载重安了一遍PostgreSQL,这次选择的是32位,成功了!

 

使用oracle_fdw扩展连接oracle数据库

  5.1 创建server   

    oracle已经使用多年,在这里就不总结oracle的配置方法了。

    以下代码可以直接在pgAdmin的SQL查询工具里直接查询。

create server oradb foreign data wrapper oracle_fdw options(dbserver 'orcl');  

 

    oradb是server的名称,'orcl'指向tnsnames.ora中配置的实例名。

 

  5.2 授予用户权限

 

grant usage on foreign server oradb to postgres;

 

    将刚创建的服务oradb授予权限于postgresql用户postgres。

 

 

 

  5.3 数据库同步

create user mapping for postgres server oradb options(user 'nk_sygis',password 'nk_sygis'); 

    postgres用户下服务oradb连接oracle数据库。

 

Oracle外部表应用

  6.1建立外部表(foreign table)

    选择oracle中一个有数据的表,先查看结构和数据。

    我习惯用Navicat Premium直接导出一个表的结构脚本。

   

    根据oracle中的表,在postgresql中创建同结构的foreign table的sql语句如下:

  

CREATE FOREIGN  TABLE AHW_MAPPOINT_TYPE (
ID integer NOT NULL ,
TYPENAME VARCHAR(50) NULL ,
TABLENAME VARCHAR(50) NULL ,
MAINICON VARCHAR(200) NULL ,
SUBICON VARCHAR(200) NULL ,
SPAREICON VARCHAR(200) NULL ,
ISDEFAULT integer NULL ,
USERNAME VARCHAR(50) NULL ,
PERMISSIONUSERS VARCHAR(1000) NULL ,
DISPLAYFIELD VARCHAR(1000) NULL ,
ALLFIELD VARCHAR(1000) NULL ,
SPARE1 VARCHAR(500) NULL ,
SPARE2 VARCHAR(500) NULL ,
REMARK VARCHAR(255) NULL 
)server oradb options(schema 'AHWD',table 'AHW_MAPPOINT_TYPE');  

  schema:写oracle中的schema(模式名),table是同步的oracle中的表名称。

  不过这里要注意pgAdmin数据库的结构中看不到外部表,不用担心,只要能正常查询到就是建立成功了。这一点不太友好,以后要找个更好的工具用了。

  6.2查询

select * from AHW_MAPPOINT_TYPE; 

  结果如下图

以上部分内容参考引用了他人的文档,原地址为:http://blog.csdn.net/freeland1/article/details/42968763