前置条件
1、对应版本列表:
服务 | 版本 |
---|---|
Oracle 12C | 12.2.0.1.0 |
Heterogeneous Agent | 12.2.0.1.0 |
odbc | 2.3.1 |
unixODBC | 2.3.6 |
psqlodbc | 9.2.24 |
查看命令:
dg4odbc #查询透明网关版本
odbc_config--version #odbc版本
odbcinst -j #unixODBC 版本
psql -v #查询psqlodbc版本
2、配置好连接postgresql的透明网关相关配置
3、外部资源:
- ORACLE 12C透明网关参数
- 透明网关配置路径:$ORACE_HOME/hs/admin
- 透明网关日志路径:$ORACE_HOME/hs/log
调整odbcinist.ini配置
调整前:
[PostgreSQL]
Description = ODBC for PostgreSQL
Driver = /usr/local/lib/psqlodbcw.so
Setup = /usr/lib64/libodbcpsqlS.so
Driver64 = /usr/local/lib/psqlodbcw.so
Setup64 = /usr/lib64/libodbcpsqlS.so
FileUsage =1
调整后: 添加参数-调整text转换成Varchar的长度
[PostgreSQL]
Description = ODBC for PostgreSQL
Driver = /usr/local/lib/psqlodbcw.so
Setup = /usr/lib64/libodbcpsqlS.so
Driver64 = /usr/local/lib/psqlodbcw.so
Setup64 = /usr/lib64/libodbcpsqlS.so
FileUsage =1
#添加参数-调整text转换成Varchar的长度,默认为8190
MaxLongVarcharSize = 65543
TextAsLongVarchar = 1
调整透明网关init*.ora配置
增加如下参数:
#该参数影响在oracle查询postgresql
HS_NLS_NCHAR = UCS2
HS_LANGUAGE = AMERICAN_AMERICA.AL32UTF8
#默认为64KB,调整为2GB=2*1024*1024
HS_LONG_PIECE_TRANSFER_SIZE=2097150
#设置服务与agent程序之间传输的数据大小
HS_RPC_FETCH_SIZE = 9999999
#默认值为byte
HS_NLS_LENGTH_SEMANTICS = CHAR
HS_KEEP_REMOTE_COLUMN_SIZE=ALL
#查询字段不要双引号
HS_FDS_QUOTE_IDENTIFIER = FALSE
调整后示例:
# This is a sample agent init file that contains the HS parameters that are
# needed for the Database Gateway for ODBC
# HS init parameters
HS_FDS_CONNECT_INFO = XXXX
HS_FDS_TRACE_LEVEL = 255
HS_FDS_SHAREABLE_NAME = /usr/local/lib/psqlodbcw.so
#该参数影响在oracle查询postgresql
HS_NLS_NCHAR = UCS2
HS_LANGUAGE = AMERICAN_AMERICA.AL32UTF8
#默认为64KB,调整为2GB=2*1024*1024
HS_LONG_PIECE_TRANSFER_SIZE=2097150
#设置服务与agent程序之间传输的数据大小
HS_RPC_FETCH_SIZE = 9999999
#默认值为byte
HS_NLS_LENGTH_SEMANTICS = CHAR
HS_KEEP_REMOTE_COLUMN_SIZE=ALL
#查询字段不要双引号
HS_FDS_QUOTE_IDENTIFIER = FALSE
HS_FDS_MAP_NCHAR=TRUE
HS_SQL_HANDLE_STMT_REUSE=TRUE
HS_FDS_GRAPHIC_TO_MBCS=TRUE
HS_FDS_MBCS_TO_GRAPHIC=TRUE
# ODBC specific environment variables
set ODBCINI=/home/oracle/.odbc.ini
扩展字符类型
Oracle12c之前,VARCHAR2和NVARCHAR2的最大长度为4000B,而RAW最大长度为2000B,从12c开始这些类型的最大长度已经扩展至32767B。但oracle 12c默认max_string_size=STANDER,也就是VARCHAR2和NVARCHAR2的最大长度为4000B。而postgressql中一旦插入长度超过2000会出现如下现象:
- 查询不展示超长字段
- 透明网关日志会报“this datatype is not support”
因为通过透明网关执行时,会把列类型转换为NVARCHAR2类型,而nvarchar2类型支持的长度为2000,所以要想插入2000以上的就需要扩展nvarchar2的长度。
那如何扩展字符类型呢?具体操作如下:**oracle 12c为插拔式数据库,这里把需要扩展的数据库设定为WETTEST,通过命令:sqlplus / as sysdba
连接操作步骤如下:
1--查看参数并调整参数值
show parameter max_string_size;
alter system set max_string_size=EXTENDED scope=spfile;
2--关闭数据库
shutdown immediate;
3--以升级模式启动数据库;
startup upgrade;
show parameter max_string_size;
alter session set container=WELTEST;
alter pluggable database WELTEST open upgrade;
@?/rdbms/admin/utl32k.sql
alter pluggable database WELTEST close immediate;
4--重启数据库
shutdown immediate;
startup;
show parameter max_string_size;
show pdbs;--查看数据库
alter pluggable database WELTEST open;
测试样例:
DROP TABLE weltest;
create table weltest
(
tab_nu NVARCHAR2(16383),
tab_varchar VARCHAR2(32767)
)
通过上述样例你会发现:
- NVARCHAR2最长为16383,所以一旦所查询库对应列至超过最大长度时,透明网关不会展示对应列
- VARCHAR2最长为32767