このトピックでは、oracle_fdw 拡張機能を使用して Oracle データベースに接続する方法について説明します。 この拡張機能を使用して、PostgreSQL データベースのテーブルと Oracle データベースのテーブル間でデータを同期することもできます。
前提条件
ApsaraDB RDS for PostgreSQL インスタンスで、マイナーエンジンバージョン 20200421 以降の PostgreSQL 12 を実行していること。
説明SHOW rds_supported_extensions;文を実行して、RDS インスタンスの現在のマイナーエンジンバージョンで oracle_fdw 拡張機能がサポートされているかどうかを確認できます。 現在のマイナーエンジンバージョンで oracle_fdw 拡張機能がサポートされていない場合は、最初にマイナーエンジンバージョンを更新する必要があります。Oracle クライアントのバージョンが 11.2 以降であること。
Oracle サーバーのバージョンが Oracle クライアントのバージョンに基づいていること。 詳細については、「Oracle ドキュメント」をご参照ください。
RDS インスタンスが存在する VPC (Virtual Private Cloud) の CIDR ブロックを、接続する Oracle データベースの IP アドレス ホワイトリストに追加する必要があります。 CIDR ブロックの例:
172.xx.xx.xx/16。説明RDS インスタンスが存在する VPC の CIDR ブロックは、ApsaraDB RDS コンソールの [データベース接続] ページで確認できます。

背景情報
oracle_fdw 拡張機能は、外部テーブルを管理するために PostgreSQL によって開発されました。 この拡張機能は、Oracle データベースへの容易なアクセスを提供し、PostgreSQL データベースと Oracle データベース間でデータを同期できるようにします。
詳細については、「oracle_fdw」をご参照ください。
使用上の注意
UPDATE 文または DELETE 文を実行する場合は、外部テーブルの作成時にプライマリキー列の key パラメーターを true に設定する必要があります。 詳細については、このトピックの「外部テーブルを作成する」セクションをご参照ください。
外部テーブルの列のデータ型は、oracle_fdw 拡張機能で識別および変換できる必要があります。 oracle_fdw 拡張機能でサポートされている変換ルールの詳細については、「データ型」をご参照ください。
oracle_fdw 拡張機能は、WHERE 句と ORDER BY 句を Oracle データベースにプッシュダウンできます。
oracle_fdw 拡張機能は、JOIN 操作を Oracle データベースにプッシュダウンできます。 プッシュダウンには次の制限があります。
JOIN 操作の両方のテーブルが同じデータベースマッピングで定義されている必要があります。
3 つ以上のテーブルに対する JOIN 操作はプッシュダウンできません。
JOIN 操作は SELECT 文に含める必要があります。
JOIN 条件のないクロス JOIN 操作はプッシュダウンできません。
JOIN 操作がプッシュダウンされた場合、ORDER BY 句はプッシュダウンされません。
PostGIS がインストールされると、oracle_fdw 拡張機能はさらに次の空間データ型をサポートします。
Point
Line
Polygon
MultiPoint
MultiLine
MultiPolygon
oracle_fdw 拡張機能を作成および削除する
oracle_fdw 拡張機能を作成する前に、RDS for PostgreSQL インスタンスのメジャーエンジンバージョンとマイナーエンジンバージョンが「前提条件」で説明されている要件を満たしていることを確認してください。
拡張機能を作成する
CREATE EXTENSION oracle_fdw;拡張機能を削除する
DROP EXTENSION oracle_fdw;oracle_fdw 拡張機能を使用する
次のいずれかの文を実行して、Oracle データベースマッピングを作成します。
CREATE SERVER <サーバー名> FOREIGN DATA WRAPPER oracle_fdw OPTIONS (dbserver '//<Oracle データベースへの接続に使用する内部エンドポイント>:<Oracle データベースへの接続に使用する内部ポート>/<接続する Oracle データベースの名前>');CREATE SERVER oradb FOREIGN DATA WRAPPER oracle_fdw OPTIONS (host '<Oracle データベースへの接続に使用する内部エンドポイント>', port '<Oracle データベースへの接続に使用する内部ポート>', dbname '<接続する Oracle データベースの名前>');
次の文を実行して、ユーザーマッピングを作成します。
CREATE USER MAPPING FOR <PostgreSQL データベースへのログオンに使用するユーザー名> SERVER <ユーザーマッピングの名前> OPTIONS (user '<Oracle データベースへのログオンに使用するユーザー名>', password '<Oracle データベースへのログオンに使用するパスワード>');説明Oracle ユーザー資格情報を PostgreSQL データベースに保存しない場合は、user パラメーターを空の文字列に設定し、外部認証資格情報を提供します。
例:
CREATE USER MAPPING FOR pguser SERVER oradb OPTIONS (user 'orauser', password 'orapwd');次の文を実行して、外部テーブルを作成します。
CREATE FOREIGN TABLE oratab ( id integer OPTIONS (key 'true') NOT NULL, text character varying(30), floating double precision NOT NULL ) SERVER oradb OPTIONS (table 'ORATAB', schema 'ORAUSER', max_long '32767', readonly 'false', sample_percent '100', prefetch '200');説明外部テーブルのスキーマは、マップされた Oracle テーブルのスキーマと一致している必要があります。
次の表に、OPTIONS のパラメーターを示します。
パラメーター
説明
key
列をプライマリキー列として設定するかどうかを指定します。 有効な値: true および false。 デフォルト値: false。 UPDATE 文と DELETE 文を実行する場合は、すべてのプライマリキー列の値を true に設定する必要があります。
table
必須。 Oracle テーブルの名前。 値は大文字にする必要があります。 Oracle SQL 文を使用して、table パラメーターの値を定義することもできます。 例:
OPTIONS (table '(SELECT col FROM tab WHERE val = ''string'')')。 この場合は、schema パラメーターを使用しないでください。schema
現在接続しているユーザーに属していないテーブルにアクセスするための Oracle ユーザー名。 値は大文字にする必要があります。
max_long
Oracle テーブルで LONG、LONG RAW、または XMLTYPE データ型を持つ列の最大長。 有効な値: 1 ~ 1073741823。 デフォルト値: 32767。
readonly
Oracle テーブルが読み取り専用かどうかを指定します。 値が true の場合、INSERT 文、UPDATE 文、または DELETE 文を実行することはできません。
sample_percent
PostgreSQL テーブル統計を計算するためにランダムに選択される Oracle テーブルブロックの割合。 有効な値: 0.000001 ~ 100。 デフォルト値: 100。
prefetch
外部テーブルのスキャン中に PostgreSQL と Oracle 間の 1 回のラウンドトリップ伝送でフェッチされる行数。 有効な値: 0 ~ 1024。 デフォルト値: 200。 値 0 は、プリフェッチ機能が無効になっていることを示します。
外部テーブルを作成した後、それを使用して Oracle テーブルに対する操作を実行できます。 DELETE、INSERT、UPDATE、SELECT などの基本的な SQL 文がサポートされています。 外部テーブル定義をインポートできます。 文の例:
IMPORT FOREIGN SCHEMA <ora_schema_name>
FROM SERVER <server_name>
INTO <schema_name>
OPTIONS (case 'lower');case パラメーターには、次の有効な値のいずれかを設定できます。
keep: Oracle と同じオブジェクト名を使用します。 ほとんどの場合、名前は大文字です。
lower: すべてのオブジェクト名を小文字に変換します。
smart: すべて大文字のオブジェクト名のみを小文字に変換します。