oracle_fdwを使って、Windows10上のPostgresとOracle Databaseを繋ぐ

# 概要
Oracle　とPostgreSQLの連携方法で手間取ったので、忘備録として残しときますー。


# 対象読者
windowsに立てたpostgreSQLからOracle Databaseにアクセスしたい方

# 配置図
```plantuml
@startuml
left to right direction
node Windows10{
node Docker {

  database OracleDB as "OracleDB"{
 
  card "OracleDB\nログイン情報 \n User:sysytem \n PASS:pass\n IP=localhost  \n port=11521\nサービス名=FREE"
  portin oracle_in
  }

}

  database PostgreSQL as "PostgreSQL"{
  card "PostgreSQL\nログイン情報 \n User:postgres \n PASS:postgres\n IP=localhost \n port=5435"
  portin postgres_in
  portout postgres_out
  }

node A5SQL{
card "役割：SQLクライアント"

}
}
A5SQL --> postgres_in:接続
postgres_out --> oracle_in: oracle_fdw


@enduml

```



# 環境

名称|バージョン|説明
---|----|------
Windows|10|クライアントのOS
Oracle instant client  |21.9|Oracle Databaseにアクセスするためのツール
A5:SQL|2.20.1|SQLのGUIクライアント 確認するために使う。
docker|--|コンテナ型仮想環境 OracleDatabaseを構築するために使用
Oracle Database|23ai Free Release 23.0.0.0.0|連携先のデータべース
PostgreSQL|14.5|--
Oracle_fdw|2.50|PostgreSQLのプラグイン Oracle Databaseとアクセスするためのプラグイン


# 前提条件
・Windows版 PostgreSQL 導入済み

・Oracle instant 導入済み
 https://qiita.com/RYA234/items/3b5f9f584b9cca7ef686

・Oracle Database 構築済み
 https://qiita.com/RYA234/items/19abe4a44e9820c9efd3

# 手順

## oracle側の設定
無し。PostgresSQL側の設定だけです。
一応明記しておきます。



## postgreSQL側の設定

### フォルダ・ファイルの上書き

#### oracle_fdwのダウンロード
下のリンクから「oracle_fdw-2.5.0-pg14-win64.zip」をダウンロードして解凍する。
https://github.com/laurenz/oracle_fdw/releases/tag/ORACLE_FDW_2_5_0


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/8a0fc7e9-5cf0-1bc7-d44d-fae6942f922e.png)




#### PostgreSQLのデータベースクラスタに　oracle_fdwを上書き保存する
方法としては、ダウンロードしたフォルダをPostgreSQLのデータベースクラスに上書き保存します。

コピー元のファイル：
4点のフォルダ
・debug_symbols
・doc
・lib
・share



コピー先の親フォルダ　
C:\Program Files\PostgreSQL\14

画像
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/280f978a-d2e6-8cb2-c2fc-4ad12f018d46.png)


### SQL部分

#### 1.PostgresSQL側で　oracle_fdwを有効化する
```sql
-- 1.oracle_fdwをロード
CREATE EXTENSION oracle_fdw;
-- 1.pg_extensionにoracle_fdwが追加されていることを確認
select * from pg_catalog.pg_extension;
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/15962f57-f8bd-caef-e4df-0527fada060c.png)



#### 2.Oracle　DatabaseのIP PORT サービス名を登録

```sql
-- 2.Oracle　DatabaseのIP PORT サービス名を登録
-- 今回の場合はIP=127.0.0.1　PORT=11521　サービス名=FREE
CREATE SERVER oracle_server FOREIGN DATA WRAPPER oracle_fdw OPTIONS (dbserver '//127.0.0.1:11521/FREE');

-- 2.権限追加　確認の仕方わからない..........
GRANT USAGE ON FOREIGN SERVER oracle_server TO postgres;

-- 2.pg_foreign_serverにoracle_serverが作成されていることを確認
select * from pg_catalog.pg_foreign_server;

```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/fd89ec76-6e4e-4fff-06d5-a74fe4568b22.png)

#### 3.ユーザーマッピング Oracle側のユーザとパスワードを登録
```sql
-- 3.ユーザーマッピング Oracle側のユーザとパスワードを登録
CREATE USER MAPPING FOR postgres SERVER oracle_server OPTIONS ( USER 'system', PASSWORD 'pass');
-- 3.pg_user_mappingで確認
select * from pg_catalog.pg_user_mapping;

```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/11f71e55-0466-7470-179f-c626a7593864.png)

#### 4.外部テーブルを作成する

```sql
-- 4.外部テーブルを作成
CREATE FOREIGN TABLE help(TOPIC varchar(50) , SEQ integer OPTIONS (key 'true'), INFO varchar(80)) SERVER oracle_server OPTIONS (SCHEMA 'SYSTEM', TABLE 'HELP');
 
--  4.作成した外部テーブルを確認
SELECT * FROM help;

```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/e089223e-a4a5-2612-b4d0-a38fb69f9b39.png)






# 感想
・次はDocker上のpostgreSQLで連携できるようにしときます！


# 参考

富士通のサイト
https://www.fujitsu.com/jp/products/software/resources/feature-stories/postgres/article-index/oracle-fdw-basic/


https://qiita.com/plusultra/items/e5023a8cf4d55e8130b2