Windows系统oracle_fdw安装与查询sdo_geometry数据过程记录

oracle_fdw下载

oracle_fdw的github地址点击这里,相关介绍在此不再赘述。

选择所需版本的release在这里插入图片描述
在这里插入图片描述
最新的2.6与2.7版本需要编译,而不需要编译的2.5版本及之前版本未成功实现extension故此介绍源码编译流程。

编译过程

前期准备:
在完成下载后需要准备Postgresql与Oracle环境,此处Postgresql选择使用16版本,下载地址;Oracle选择使用Instant Client,下载地址

由于使用完整版Oracle客户端时在编译oracle_fdw时出现错误:
error C1083: 无法打开包括文 件: “oci.h”: No such file or directory
故此选用Instant Client版本,版本号为Version 19.24.0.0.0,此处我下载了Basic Package,SQL*Plus Package,SDK Package,ODBC Package,此处并未研究最低要求。

其中,环境变量需要设置Path与ORACLE_HOME,设置方法此处省略。

此外,还需要msbuild作为编译工具,此为visual studio工具,使用Native Tools Command Prompt for VS工具打开。

编译:
Windows版本编译方法原文见github的oracle_fdw项目主页,Building oracle_fdw on Windows一栏,在此仅放上编译命令:

cd \path\to\oracle_fdw\msvc
msbuild oracle_fdw.sln /p:Configuration=(Debug or Release) /p:Platform=(Win32 or x64) /p:OracleClient=(path to Oracle Client/SDK) /p:PostgreSQL=(path to PostgreSQL installation)

其中,\path\to\oracle_fdw为oracle_fdw对应地址,括号内部替换为环境对应项,如:

msbuild oracle_fdw.sln /p:Configuration=Debug /p:Platform=x64 /p:OracleClient=D:\oracle /p:PostgreSQL=D:\PGSQL

此处遇到的问题:
使用客户端版本的Oracle 11g作为OracleClient会出现错误:
error C1083: 无法打开包括文 件: “oci.h”: No such file or directory
后改用Oracle Instant Client,并改用对应的Oracle_Home与Path后该问题解决。

创建拓展

编译完成后,需要将编译好的oracle_fdw.dll放入PG目录下的\lib文件夹中,源码中原本存在的oracle_fdw.control与oracle_fdw–1.2.sql、oracle_fdw–1.1–1.2.sql、oracle_fdw–1.0–1.1.sql均放入PG目录下的\share\extension中。

完成上述过程后便可以启动数据库并在PG中添加拓展了,此处需要注意,若需要使用空间数据,需要在添加oracle_fdw之前添加postgis的拓展。

首先,确认oracle_fdw相关文件是否正确放置

select * from pg_available_extensions;

可以在列表中查找所需extension是否存在。
如果正确安装即可获得如下所示:
在这里插入图片描述
接下来就可以创建拓展了:

postgres=# create extension oracle_fdw;

Messages:CREATE EXTENSION

若创建成功可以通过以下命令确认:

postgres=# select oracle_diag();

在这里插入图片描述
此时,便可以进行对oracle的连接查询了。

此处遇到的问题:
在使用非源码编译版本的oracle_fdw时出现:
无法加载库 “/Postgresql/lib/oracle_fdw.dll”: The specified procedure could not be found
存在oracle path设置错误或存在多个oracle导致的可能,但由于我在设置对应path并屏蔽掉其他oracle后仍然无法解决,故改用使用源码编译获得的dll,该问题解决。

连接oracle

create server ora foreign data wrapper oracle_fdw options (dbserver ‘//localhost/ORCL’);

Messages: CREATE SERVER
此处ora为创建的server名称,dbserver为必须项,’ ’ 内为oracle对应连接串

grant usage on foreign server fdw_server to postgres;

Messages: GRANT
此处为postgres用户赋权

create user mapping for postgres server fdw_server options(user ‘username’,password ‘password’);

Messages: CREATE USER MAPPING
此处为创建用户mapping,需要对应oracle的用户与密码

create foreign table p_table(id integer, geo geometry)server fdw_server options(schema ‘ORA’, table ‘O_TABLE’);

Messages: CREATE FOREIGN TABLE
此处为创建对应的外部表,p_table为pg中使用的表名称,表结构需与oracle类型相对应,名称可不做对应,options中需要注意’ ’ 内部的大小写敏感。

insert into spatial values(1, st_geomfromtext(‘linestring(10 14,6 10)’));

Messages: INSERT 0 1
可进行数据插入,对于spatial数据插入数据格式为postgis的geometry格式,oracle_fdw将会将该数据进行转换。

select * from p_table;
在这里插入图片描述

此处查询的数据为Postgis对应的geometry类型数据,在oracle中查询结果如下:

SQL> select * from ora.sdo_test;
ID GEO(SDO_GTYPE, SDO_SRID, SDO_POINT(X, Y, Z), SDO_ELEM_INFO, SDO_ORDINATES)
1 SDO_GEOMETRY(2002, NULL, NULL, SDO_ELEM_INFO_ARRAY(1, 2, 1), SDO_ORDINATE_ARRAY(
10, 14, 6, 10))

此处遇到的问题:
ERROR: column “geo” (50679) of foreign table “p_table” cannot be converted to or from Oracle data type (20)
github中作者对此问题的说明是可能是由于未加载postgis拓展或拓展加载顺序错误导致,但此处我已经加载成功并且是先加载postgis后加载oracle_fdw,后经研究发现仅需要重启一个新的Query tool即可以解决该问题,这意味着需要重启会话才能够让oracle_fdw获取到geometry列的oid值并与oracle的sdo_geometry对应。
需要注意,在oracle端插入数据后记得需要commit,不然数据并未提交,pg端将无法查询展示。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值