最近在项目上遇到需要使用我们公司后台数据库操作客户现场postgreSQL数据库的需求,在此总结一下相关的实践过程,以便后续遇到同样的问题时查阅。
windows下的跨数据库连接
环境参数:
+ oracle version: 11g
+ postgreSQL version: 10.4
+ 操作系统: windows10
1、在Oracle服务器为PostgreSQL数据库建立ODBC数据源
安装PostgreSQL的ODBC驱动
下载安装后,到
控制面板
中找到管理工具
,打开
点击添加按钮新增系统ODBC数据源
配置数据源属性
配置完成后点击test
若通过测试,点击save
。至此,PostgreSQL的ODBC数据源创建成功。
2、为Oracle 数据库配置HS
- 在
$ORACLE_HOME/hs/admin
路径下新建initPG_LINK.ora
文件,添加内容如下:
HS_FDS_CONNECT_INFO = PG_LINK HS_FDS_TRACE_LEVEL = 0
ps:上述ora文件名中
PG_LINK
为之前创建的数据源的名称。
修改
$ORACLE_HOME/NETWORK/admin
路径下tnsnames.ora
文件,添加内容如下:
PG_LINK = (DESCRIPTION= (ADDRESS=(PROTOCOL=tcp)(HOST=<ORA_DB_HOSTNAME>)(PORT=<ORA_DB_PORT>)) (CONNECT_DATA=(SID=PG_LINK)) (HS=OK) )
修改
$ORACLE_HOME/NETWORK/admin
路径下listener.ora
添加如下内容(在SID_LIST中):
SID_LIST_<your_LISTENER_NAME>= (SID_LIST= (SID_DESC= (SID_NAME=PG_LINK) (ORACLE_HOME=<your_ORACLE_HOME>) (PROGRAM=dg4odbc) ) )
重新加载listener配置
以系统管理员身份运行cmd,执行下述命令:
lsnrctl reload <your_LISTENER_NAME>
3、oracle建立database link
create database link PG_LINK connect to "pguser" identified by "pgpass" using 'PG_LINK';
ps:注意语句中的双引号的使用,在postgreSQL中未被双引号包围的内容自动转为小写;oracle中则是自动转为大写,若关键内容不用双引号包围,则会引发错误。
同样的,在通过dblink进行跨库查询时也要注意同样的问题。
eg:
SQL> select * from "testtable"@PG_LINK;
col1
----------------------------------------------------------------
test row 1
若不用双引号,会产生如下ORA-28500错误:
SQL> select * from testtable@PG_LINK;
select * from testtable@PG_LINK
*
ERROR at line 1:
ORA-28500: connection from ORACLE to a non-Oracle system returned this message:
ERROR: relation "TESTTABLE" does not exist;
No query has been executed with that handle {42P01,NativeErr = 1}
ORA-02063: preceding 3 lines from PG_LINK
参考文章:https://dbaspot.wordpress.com/2013/05/29/how-to-access-postgresql-from-oracle-database/