PostgreSQL odbc_fdw 数据无法正确显示

问题描述 投票:0回答:1

通过odbc_fdw连接Oracle和DB2并检索数据后,表的记录数显示正确,但每条记录的字段数据显示不正确。

第一个字段的值始终为“#”,第二个字段之后的字段值为空。

[参考信息]

  • 服务端版本如下: 操作系统:Windows Server 2019 标准版 PostgreSQL:postgresql-x64-16

  • PostgreSQL服务器端数据库字符集为UTF8 * 看来不是字符编码的问题。

  • OS端的ODBC定义是正确的。 可以使用另一个工具(A5:SQL Mk-2)正确引用它。

  • 我尝试使用以下两个版本的odbc_fdw模块,但结果是一样的:

      1.The Windows binary version (0.5.2.3) from the following site, CREATE EXTENSION odbc_fdw
    
           https://www.postgresonline.com/journal/index.php?/categories/85-odbc_fdw
    
           POSTGRESQL 16 64-BIT FOR WINDOWS FDWS
    
      2\. The build result of the source code from the following site (0.5.2.3), ALTER EXTENSION odbc_fdw UPDATE                  https://github.com/CartoDB/odbc_fdw
    
  • 其他模块状态:

    oracle_fdw : OK (Oracle seems usable, no issues with Japanese)
    
    db2_fdw  :   NG (Only supports US English version of Windows?)
    
    tds_fdw  :   NG (Not supported on Windows)
    
    jdbc_fdw :   NG (Build attempt resulted in errors, possibly not supported on Windows?)
    

■查询结果:odbc_fdw(Oracle)

postgres=# select count(*) from odbc_zzzz_test_tbl4;
count
-------
      2
(1 row)
postgres=# select * from odbc_zzzz_test_tbl4;
 data_id | name1 | name2 | update_d
---------+-------+-------+----------
 #       |       |       |
 #       |       |       |
(2 rows)

■查询结果:odbc_fdw(DB2)

postgres=# select count(*) from odbc_yyyy_CONNHEADER_SCMDWH_EVENT;
 count
-------
  1263
(1 row)

postgres=# select * from odbc_yyyy_CONNHEADER_SCMDWH_EVENT;
 appl_id | appl_name | client_protocol
---------+-----------+-----------------
 #       |           |
 #       |           |
 #       |           |
 #       |           |
 (rest omitted)

■定义:odbc_fdw(Oracle)

CREATE SERVER odbc_zzzz
FOREIGN DATA WRAPPER odbc_fdw
OPTIONS (dsn 'zzzz', encoding 'SJIS');

CREATE USER MAPPING FOR postgres
SERVER odbc_zzzz
OPTIONS (odbc_UID 'xxxx', odbc_PWD 'xxxx');

CREATE FOREIGN TABLE
  odbc_zzzz_test_tbl4 (
    DATA_ID text,
    NAME1 text,
    NAME2 text,
    UPDATE_D date
  )
  SERVER odbc_zzzz
  OPTIONS (
    sql_query 'select DATA_ID,NAME1,NAME2,UPDATE_D from ssss.test_tbl',
    sql_count 'select count(DATA_ID) from ssss.test_tbl'
  );

----------------------------------
* Oracle Table Definition

CREATE TABLE ssss.TEST_TBL
(
    DATA_ID                        VARCHAR2(8),
    NAME1                          VARCHAR2(10),
    NAME2                          VARCHAR2(50),
    UPDATE_D                       DATE
)
----------------------------------

■定义:odbc_fdw (DB2)

CREATE SERVER odbc_yyyy 
FOREIGN DATA WRAPPER odbc_fdw 
OPTIONS (dsn 'yyyy', encoding 'SJIS');

CREATE USER MAPPING FOR postgres
SERVER odbc_yyyy
OPTIONS (odbc_UID 'xxxx', odbc_PWD 'xxxx');

CREATE FOREIGN TABLE
  odbc_yyyy_CONNHEADER_SCMDWH_EVENT (
    APPL_ID text,
    APPL_NAME text,
    CLIENT_PROTOCOL integer
  )
  SERVER odbc_yyyy
  OPTIONS (
    sql_query 'select APPL_ID,APPL_NAME,CLIENT_PROTOCOL from aaaa.bbbb_tbl',
    sql_count 'select count(APPL_ID) from aaaa.bbbb_tbl'
  );

可能是什么问题? 有具体解决办法吗?

提前感谢您的帮助。

postgresql oracle db2 odbc
1个回答
0
投票

谢谢您提供的信息。 我无法用 VARCHAR 定义它,所以我尝试用 CHAR 代替, 但结果是一样的。

CREATE TABLE ssss.TEST_TBL2
(
    DATA_ID                        CHAR(8),
    NAME1                          CHAR(10),
    NAME2                          CHAR(50),
    UPDATE_D                       DATE
)

CREATE FOREIGN TABLE
  odbc_zzzz_test_tbl22 (
    DATA_ID text,
    NAME1 text,
    NAME2 text,
    UPDATE_D date
  )
  SERVER odbc_zzzz
  OPTIONS (
    sql_query 'select DATA_ID,NAME1,NAME2,UPDATE_D from ssss.TEST_TBL2',
    sql_count 'select count(DATA_ID) from ssss.TEST_TBL2'
  );


postgres=#     select count(*) from odbc_zzzz_test_tbl22;
 count
-------
     2
(1 row)


postgres=#     select * from odbc_zzzz_test_tbl22;
 data_id | name1 | name2 | update_d
---------+-------+-------+----------
 #       |       |       |
 #       |       |       |
(2 rows)
© www.soinside.com 2019 - 2024. All rights reserved.