• 締切済み

PostgreSQL odbc_fdwデータ異常

odbc_fdw経由でoracleとdb2へ接続し、データを取得したところ、 テーブルのレコード件数は正しく表示されますが、 各レコードの項目のデータが正しく表示されません。 ※常に1項目目の値は'#'、2項目目以降はnull 何が問題なのでしょうか? 具体的な対処法はありますでしょうか? よろしくお願いいたします。 [参考情報] ・サーバ側のバージョンは以下の通り OS: Windows Server 2019 Standard PostgreSQL: postgresql-x64-16 ・postgreSQLサーバ側のデータベースの文字コードはUTF8 ※特に文字化けの問題ではなさそうな気はします。 ・OS側のODBCの定義は問題ありません。 別のツール(A5:SQL Mk-2)で正しく参照できています。 ・odbc_fdwのモジュールは以下の2つで試しましたが、結果は同じです 1. 以下のサイトのWindows用のバイナリバージョンで、CREATE EXTENSION odbc_fdw https://www.postgresonline.com/journal/index.php?/categories/85-odbc_fdw POSTGRESQL 16 64-BIT FOR WINDOWS FDWS 2. 下記サイトのソースコードをビルドした結果を、ALTER EXTENSION odbc_fdw UPDATE https://github.com/CartoDB/odbc_fdw ■参照結果: 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 ---------+-----------+----------------- # | | # | | # | | # | | (以下省略) ■定義: odbc_fdw(oracle) CREATE SERVER odbc_zzzz FOREIGN DATA WRAPPER odbc_fdw OPTIONS (dsn 'PANDA-DEV', 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' ); ■定義: 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' );

みんなの回答

回答No.1

あなたのPostgreSQLサーバーとodbc_fdw経由でOracleおよびDB2のデータにアクセスする際に問題が発生しているようです。特に、データ自体が正しく表示されず、各レコードの1項目目が常に「#」であり、2項目目以降がnullになっている点に関してです。考えられる原因と具体的な対処法を以下に示します。 ### 考えられる原因 1. **ODBCドライバーの互換性**: ODBCドライバーがPostgreSQLのodbc_fdwと互換性がない、もしくはドライバー自体が最新のものではない可能性があります。この場合、ドライバーを最新のものに更新するか、別のドライバーを試すことが推奨されます。 2. **文字コードの問題**: データベースの文字コードが一致していない可能性があります。書かれている通り、文字化けの問題ではなさそうですが、文字コードの設定は確認していただくことをお勧めします。 3. **SQLクエリの設定**: odbc_fdwのオプションで指定されたSQLクエリが正しく動作しない場合があります。特に特定のカラムやデータ型の取り扱いが問題となることがあります。 4. **データ型の不一致**: PostgreSQLに定義された外部テーブルのカラムデータ型が、OracleおよびDB2の実際のデータ型と合っていない可能性があります。 ### 具体的な対処法 1. **ODBCドライバーの更新**: 使用しているODBCドライバーの最新バージョンをインストールしてみてください。また、異なるバージョンのドライバーを試してみることも有効です。 2. **SQLクエリの見直し**: オプションで指定されている`sql_query`および`sql_count`のクエリが問題ないか確認してください。特に、データ型の指定やカラム名の大文字・小文字の違いがないかをチェックする必要があります。 3. **サンプルデータやシンプルなクエリのテスト**: よりシンプルなテーブルやクエリを使用して、基礎的な部分に問題がないかをテストしてください。これにより、問題の範囲を特定しやすくなります。 4. **文字コードの確認**: PostgreSQL側のデータベースとOracle、DB2のデータベースの文字コード設定を再度確認し、一致させるよう試みてください。特に、SJISエンコーディングの指定が適切かどうか確認します。 5. **データ型の一致確認**: 外部テーブルのカラムデータ型が、実際のOracleやDB2のテーブルのカラムデータ型と一致しているかを再確認して下さい。 以上の手順を試してみることで、問題が解決される可能性があります。何か特定のエラーメッセージやログ情報がある場合は、そちらも確認して追加の手がかりを探してみると良いでしょう。さらに問題が続く場合は、PostgreSQLの公式ドキュメントやコミュニティフォーラムでの問い合わせも検討してみてください。 ------------------------------------------------ こちらの回答はAIエージェント「あい」による参考回答です。 有識者からの回答も是非お待ちしています。 OKWAVEのAIに対する取り組みについてはこちらをご確認ください。 https://staffblog.okwave.jp/2023/06/07/10415/

toyo_365
質問者

補足

ご回答ありがとうございます。 対処法3について、Oracleについて実施しています。 テスト用で作成したテーブルは以下となります。 CREATE TABLE ssss.TEST_TBL ( DATA_ID NUMBER(8,0), NAME1 VARCHAR2(10), NAME2 VARCHAR2(50), UPDATE_D DATE ) 対処法2及び対処法5の観点で何か問題はありますでしょうか? ※少なくともカラム名は全て大文字指定、 テーブル名は試してみますが、そもそもsql_count側は問題なし 対処法4について、以下の通り指定しています。何か問題等ありますでしょうか? ・Oracleサーバ側: 'JA16SJISTILDE' ・PostgreSQL: 'UTF8'(CREATE DATABASEでENCODING = 'SJIS'はエラーになります) ・外部サーバー定義: encoding 'SJIS' ・環境変数定義: NLS_LANG = JAPANESE_JAPAN.JA16SJIS ※特に不要かもしれませんが 対処法1については、少し試してみようとは思いますが、何かしら根拠はありませんでしょうか? ※そもそもOracleとDB2のドライバ経由で同じ結果です。 > 何か特定のエラーメッセージやログ情報がある場合は、そちらも確認して追加の手がかりを探してみると良いでしょう。 特にエラーは発生していません。 > さらに問題が続く場合は、PostgreSQLの公式ドキュメントやコミュニティフォーラムでの問い合わせも検討してみてください。 海外サイトへの質問を検討しています。 以上、よろしくお願いいたします。

関連するQ&A