通过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'
);
可能是什么问题? 有具体解决办法吗?
提前感谢您的帮助。
谢谢您提供的信息。 我无法用 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)