如何使用Oracle ODBC Gateway通过ODBC将Oracle连接到PostgreSQL?

时间:2013-02-22 15:46:31

标签: linux oracle postgresql odbc

我想从运行Oracle自定义Linux风格的服务器上的Oracle实例运行openSUSE的服务器上选择PostgreSQL实例。我想使用Oracle ODBC网关执行此操作。我过去已成功完成此操作,并继续使用相同的Oracle框和其他SUSE / Postgres框进行此操作。

我在SUSE(Postgres)方面的ODBC管理器是:unixODBC

我的odbc.ini是:

[postgresql]
Description         = Test to Postgres
Driver              = /usr/lib64/psqlodbcw.so
Trace               = Yes
TraceFile           = sql.log
Database            = host
Servername          = localhost
UserName            = *****
Password            = *****
Port                = 5432
Protocol            =
ReadOnly            = Yes
RowVersioning       = No
ShowSystemTables    = No
ShowOidColumn       = No
FakeOidIndex        = No
ConnSettings        =

我的odbcinst.ini是

[postgresql]
    Description             = Postgresql driver for Linux
Driver          = /usr/lib64/psqlodbcw.so
UsageCount              = 1

我的tnsnames.ora(省略了其他ODBC条目)是:

# tnsnames.ora Network Configuration File: /opt/oracle/product/11gR1/db/network/admin/tnsnames.ora
# Generated by Oracle configuration tools.

LISTENER_ORCL =
  (ADDRESS = (PROTOCOL = TCP)(HOST = dbs1)(PORT = 1522))

ORCL =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = dbs1)(PORT = 1522))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = orcl)
    )
  )

ODBC_SERVER123=
  (DESCRIPTION=
    (ADDRESS=
      (PROTOCOL=TCP)
      (HOST=dbs1)
      (PORT=1522)
    )
    (CONNECT_DATA=
       (SID=server123)
    )
    (HS=OK)
  )

我的listener.ora(省略了其他SID_DESC条目)是:

# listener.ora Network Configuration File: /opt/oracle/product/11gR1/db/network/admin/listener.ora
# Generated by Oracle configuration tools.

LISTENER =
        (DESCRIPTION_LIST =
                (DESCRIPTION =
                        (ADDRESS_LIST=
                                (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1522))
                                (ADDRESS = (PROTOCOL = TCP)(HOST = dbs1)(PORT = 1522))
                        )
                )
        )

ADR_BASE_LISTENER = /opt/oracle

SID_LIST_LISTENER=
        (SID_LIST=
                (SID_DESC=
                        (SID_NAME=server123)
                        (ORACLE_HOME=/opt/oracle/product/11gR1/db)
                        (PROGRAM=dg4odbc)
                        (ENVS=LD_LIBRARY_PATH=/usr/lib64:/opt/oracle/product/11gR1/db/lib)
                )
        )

TRACE_LEVEL_LISTENER = 0
LOGGING_LISTENER = off

此外,这里是位于$ ORACLE_HOME / hs / admin中的inithost123.ora文件:

#
# HS init parameters
#
HS_FDS_CONNECT_INFO = server123
HS_FDS_TRACE_LEVEL = 0
#HS_FDS_TRACE_LEVEL=DEBUG
HS_FDS_SHAREABLE_NAME = /usr/lib64/libodbc.so

HS_FDS_SUPPORT_STATISTICS = FALSE

HS_LANGUAGE=AMERICAN_AMERICA.WE8ISO8859P1
#HS_LANGUAGE=AMERICAN_AMERICA.US7ASCII
HS_FDS_TIMESTAMP_MAPPING = "TIMESTAMP(6)"
HS_FDS_FETCH_ROWS=1
HS_FDS_SQLLEN_INTERPRETATION=32

#
# ODBC specific environment variables
#
set ODBCINI=/etc/unixODBC/odbc.ini

#
# Environment variables required for the non-Oracle system
#
#set <envvar>=<value>

为了好的衡量,我的sqlnet.ora是:

# sqlnet.ora Network Configuration File: /opt/oracle/product/11gR1/db/network/admin/sqlnet.ora
# Generated by Oracle configuration tools.

NAMES.DIRECTORY_PATH= (TNSNAMES, EZCONNECT)

ADR_BASE = /opt/oracle

我使用以下内容添加了一个网关链接oracle-side:

CREATE DATABASE LINK ODBC_SERVER123 CONNECT TO "*****" IDENTIFIED BY "*****" USING 'ODBC_SERVER123';

当我尝试执行我的选择时,我收到以下错误:

[SQL] select * from "legit_view"@ODBC_SERVER123
[Err] ORA-28500: connection from ORACLE to a non-Oracle system returned this message:
[unixODBC][Driver Manager]Data source name not found, and no default driver specified {IM002}
ORA-02063: preceding 2 lines from ODBC_SERVER123

我可以使用isql:

在SUSE / Postgres框上本地成功测试ODBC
>isql -v postgresql ***** *****
+---------------------------------------+
| Connected!                            |
|                                       |
| sql-statement                         |
| help [tablename]                      |
| quit                                  |
|                                       |
+---------------------------------------+
SQL>

我忘记了什么步骤?

1 个答案:

答案 0 :(得分:0)

你的odbc.ini文件必须在远程盒子上!也就是说,发起查询的那个。在上面的示例中,它将是Oracle框。这是一个必须在Oracle(远程)框上的条目:

[server123]
Driver = /usr/lib64/psqlodbcw.so
Description = ODBC to PostgreSQL on Server 123
Trace = No
Tracefile = /var/log/sql_host_123.log
Servername = ip.address.for.123
Username = *****
Password = *****
Port = 5432
Protocol = 6.4
Database = host
QuotedId = Yes
ReadOnly            = No
RowVersioning       = No
ShowSystemTables    = No
ShowOidColumn       = No
FakeOidIndex        = No