【数据库】Oracle 12透明网关查询postgresql表某些字段不展示问题处理

前置条件

1、对应版本列表:

服务版本
Oracle 12C12.2.0.1.0
Heterogeneous Agent12.2.0.1.0
odbc2.3.1
unixODBC2.3.6
psqlodbc9.2.24

查看命令:

dg4odbc #查询透明网关版本
odbc_config--version #odbc版本
odbcinst -j #unixODBC 版本
psql -v #查询psqlodbc版本

2、配置好连接postgresql的透明网关相关配置
3、外部资源:

调整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会出现如下现象:

  1. 查询不展示超长字段
  2. 透明网关日志会报“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
微信扫码订阅
UP更新不错过~
关注
  • 0
    点赞
  • 1
    收藏 更改收藏夹
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

WEL测试

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值