oracle_fdw 1.0.0


データ型マッピング

oracle_fdw用の外部テーブルを作成する際は、Oracleのデータ型に応じて、PostgreSQL側で定義可能なデータ型に制限があります。 oracle_fdwがサポートするデータ型マッピングを以下に示します。

種別Oracleのデータ型PostgreSQLのデータ型備考
数値データ型BINARY_FLOATrealPostgreSQL、Oracleともに、浮動小数点データ型はIEEE規格754に準拠していますが、実際に扱える上限値や下限値はそれぞれで異なります。oracle_fdwでは、それぞれのドキュメントに書かれている値域の範囲のうち、狭いほうの範囲を超える値はサポートしません。サポートする範囲を超えた値がOracleに格納されている場合は、検索結果が意図しない結果になる場合があります。
BINARY_DOUBLEdouble precision
NUMBERsmallintOracleに格納されている値の範囲が-32,768から+32,767 の整数に限定されている場合は、smallint型にマッピングしてください。小数や範囲外の値がOracleに格納されている場合は、検索実行時にエラーとなります。
integerOracleに格納されている値の範囲が-2,147,483,648から+2,147,483,647の整数に限定されている場合は、integer型にマッピングしてください。小数や範囲外の値がOracleに格納されている場合は、検索実行時にエラーとなります。
bigintOracleに格納されている値の範囲が-9,223,372,036,854,775,808から9,223,372,036,854,775,807の整数に限定されている場合は、bigint型にマッピングしてください。小数や範囲外の値がOracleに格納されている場合は、検索実行時にエラーとなります。
numericOracleに格納されている値の範囲がbigintの値の範囲を超えているか、少数が格納されている場合はnumeric型にマッピングしてください。 PostgreSQL側のnumeric型に指定する精度および位取りは、Oracle側のNUMBER型の精度および位取りと同じ値を指定してください。ただし、PostgreSQLのnumeric型の位取りは0以上を指定する必要があるため、Oracle側のNUMBER型の位取りの定義が負の場合は、PostgreSQL側のnumeric型の位取りには0を指定してください。
FLOATnumericOracle側のFLOAT型の2進精度を10進精度に変換した値を、PostgreSQL側のnumeric型の精度に指定してください。2進精度に0.30103を掛けることで10進精度に変換できます。
文字データ型CHARcharPostgreSQL側のchar型に指定する長さ制限は、Oracle側のCHAR型の長さ制限と同じ値を指定してください。Oracleの長さ制限は、バイト数または文字数で指定できるのに対してPostgreSQLでは文字数でのみ指定できますが、指定方法の相異はSELECT結果には影響しません。
NCHARcharPostgreSQL側のchar型に指定する長さ制限は、Oracle側のNCHAR型の長さ制限と同じ値を指定してください。
VARCHAR2varcharPostgreSQL側のvarchar型に指定する長さ制限は、Oracle側のVARCHAR2型の長さ制限と同じ値を指定してください。Oracleの長さ制限は、バイト数または文字数で指定できるのに対してPostgreSQLでは文字数でのみ指定できますが、指定方法の相異はSELECT結果には影響しません。
text
NVARCHAR2varcharPostgreSQL側のvarchar型に指定する長さ制限は、Oracle側のNVARCHAR2型の長さ制限と同じ値を指定してください。
text
LONGvarcharOracleに格納されている(1G-2)バイトまでの値を扱えます。(1G-2)バイトを超える値を検索した場合は、検索実行時にエラーとなります。また、Oracle側のデータ型がLONG型の場合はLONG型、LONG RAW型の制限を参照してください。
text
CLOBvarchar
text
NCLOBvarchar
text
日付/時刻データ型DATEdateOracleに格納されている値の時刻部分が0時0分0秒の場合は、PostgreSQL側のdate型にマッピングしてください。時刻部分が0時0分0秒以外の場合は、時刻部分が切り捨てられた値として取得することはできますが、WHERE句の条件にDATE型をマッピングした列を指定した場合、検索結果が意図しない結果となる場合があるため、この場合はtimestamp型にマッピングしてください。
timestampOracleに格納されている値の時刻部分が0時0分0秒以外の値を含む場合は、PostgreSQL側ではtimestamp型にマッピングしてください。PostgreSQL側のtimestamp型の精度には0を指定してください。
TIMESTAMPtimestampPostgreSQL側のtimestamp型に指定する精度は、Oracle側のTIMESTAMP型の精度と同じ値を指定してください。Oracle側のTIMESTAMP型の精度が7以上の場合は、PostgreSQL側のtimestamp型の精度に6を指定してください。精度を越えた値は切り捨てられます。Oracle側のTIMESTAMP型の精度が7以上の場合の注意点はPostgreSQLとOracleの仕様の相異を参照してください。
TIMESTAMP WITH TIME ZONEtimestamp with time zonePostgreSQL側のtimestamp with time zone型に指定する精度は、Oracle側のTIMESTAMP WITH TIME ZONE型の精度と同じ値を指定してください。Oracle側のTIMESTAMP WITH TIME ZONE型の精度が7以上の場合は、PostgreSQL側のtimestamp with time zone型の精度に6を指定してください。精度を越えた値は切り捨てられます。Oracle側のTIMESTAMP WITH TIME ZONE型の精度が7以上の場合の注意点はPostgreSQLとOracleの仕様の相異を参照してください。また、OracleのTIMESTAMP WITH TIME ZONE型はタイムゾーンの情報を持っていますが、SELECT結果にはタイムゾーン情報は含まれず、timezoneに設定されたタイムゾーンに変換されて取得されます。
TIMESTAMP WITH LOCAL TIME ZONE
INTERVAL YEAR TO MONTHintervalOracleに格納されている値の範囲が-178,000,000年から178,000,000年のデータを扱えます。PostgreSQLで扱える範囲外の値がOracleに格納されている場合は、検索結果が意図しない結果となる場合があります。
INTERVAL DAY TO SECONDintervalPostgreSQL側のinterval型に指定する精度は、Oracle側のINTERVAL DAY TO SECOND型の精度と同じ値を指定してください。Oracle側のINTERVAL DAY TO SECOND型の精度が7以上の場合は、PostgreSQL側のinterval型の精度に6を指定してください。精度を越えた値は切り捨てられます。Oracle側のINTERVAL DAY TO SECOND型の精度が7以上の場合の注意点はPostgreSQLとOracleの仕様の相異を参照してください。
バイナリ列データ型RAWbyteaOracleのRAW型は最大サイズを指定する必要がありますが、PostgreSQLのbytea型はサイズ指定は不要です。この相異はSELECT結果には影響しません。
LONG RAWbyteaOracleに格納されている((1G-2)/2)バイト(536,870,911バイト)までの値を扱えます。((1G-2)/2)バイトを超える値を検索した場合は、検索実行時にエラーとなります。また、LONG型、LONG RAW型の制限を参照してください。
BLOBOracleに格納されている(1G-2)バイトまでの値を扱えます。(1G-2)バイトを超える値を検索した場合は、検索実行時にエラーとなります。
BFILE
ROWIDデータ型ROWIDなしPostgreSQLにROWIDデータ型相当のデータ型がないため、外部テーブルの列として定義できるデータ型がありません。ROWIDデータ型を文字データ型にマッピングすることで、ROWIDデータ型のデータを文字データとして取得することはできますが、WHERE句の条件にROWIDデータ型をマッピングした列を指定した場合、検索結果が意図しない結果となる場合があります。
UROWID

LONG型、LONG RAW型の制限

Oracleのテーブルに、LONG型またはLONG RAW型の列を含む場合は、max_value_lenをFDWオプションで指定してください。指定しない場合は検索実行時にエラーとなります。これは、LONG型およびLONG RAW型は列バッファの自動調整をサポートしていないためです。