oracle_fdw(Oracle外部表)

oracle_fdw是一个开源第三方插件,是PolarDB PostgreSQL版(兼容Oracle)的一个外部数据包装器FDW(Foreign Data Wrapper)。您可以使用oracle_fdw插件与外部的Oracle数据库进行交互。

前提条件

  • oracle_fdw依赖于Oracle Instant Client的动态链接库与Oracle数据库服务器进行交互。

  • 可以与oracle_fdw插件协同工作的Oracle Instant Client版本如下所示:

    • 11.2

    • 12.1、12.2

    • 18.3、18.5

    • 19.3、19.6、19.8、19.9、19.10、19.11、19.12、19.14

    • 21

    说明

    使用前,请您自行查阅Oracle官方文档中Instant Client版本与数据库服务器版本之间的兼容矩阵,确保客户端与服务器之间可兼容交互。

使用方法

  1. 安装插件。

    CREATE EXTENSION oracle_fdw;
  2. 创建外部Oracle数据库服务器。

    配置Oracle数据库的连接信息,创建PolarDB PostgreSQL版(兼容Oracle)到Oracle的映射。示例如下:

    CREATE SERVER oradb
    FOREIGN DATA WRAPPER oracle_fdw
    OPTIONS (dbserver '//host:port/dbname');

    创建外部Oracle数据库服务器参数说明如下:

    参数

    说明

    是否必填

    dbserver

    Oracle数据库的连接串,包含IP地址端口号数据库名

    isolation_level

    事务隔离级别,默认为SERIALIZABLE

    可选的参数类型如下:

    • serializable:序列化。

    • read_committed:读已提交。

    • read_only:只读。

    nchar

    是否在Oracle端开启字符转换。

    说明

    修改可能会影响性能。

  3. 创建用户映射。

    PolarDB PostgreSQL版(兼容Oracle)的用户pguser与对应Oracle数据库的用户orauser进行映射。需要配置Oracle数据库用户的用户名密码。示例如下:

    CREATE USER MAPPING
    FOR pguser SERVER oradb
    OPTIONS (user 'orauser', password 'orapwd');

    创建用户映射参数说明如下:

    参数

    说明

    是否必填

    user

    Oracle数据库用户的用户名。

    password

    Oracle数据库用户的密码。

    说明

    如果您不想在PolarDB PostgreSQL版(兼容Oracle)中存储Oracle用户的凭证,可以设置user为空字符串,并提供外部授权。

  4. 创建外部表映射。

    PolarDB PostgreSQL版(兼容Oracle)中创建一个外部表,映射到Oracle数据库的一个已有的表上。示例如下:

    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'
    );

    创建外部表参数说明如下:

    参数

    说明

    是否必填

    table

    Oracle数据库中的被映射表名,一般是大写。

    dblink

    被映射表的数据库链接,必须与Oracle系统目录中的完全一致。

    schema

    Oracle用户名,需要大写,用于访问不属于当前连接用户的表。

    max_long

    限制Oracle表中 LONGLONG RAWXMLTYPE类型列的最大长度。

    sample_percent

    PostgreSQL用于计算因统计信息而随机选择的Oracle表数据的比例(默认100)。

    prefetch

    扫描外表时PostgreSQL与Oracle之间一次性传输的数据行数。

    key

    当前列是否包含在主键约束中。

    strip_zeros

    数据传递时,是否去除字符串后的ASCII 0字符(在Oracle中合法,在PostgreSQL中非法)。

    说明
    • 外部表的结构定义需要与Oracle数据库上的被映射表的结构完全一致。

    • oracle_fdw对PolarDB PostgreSQL版(兼容Oracle)到Oracle的数据类型映射,请参见类型映射表格

  5. 使用方法。

    您可以使用操作PolarDB PostgreSQL版(兼容Oracle)普通表相同的方式来操作外部表,从而操纵远程Oracle数据库中的表。

  6. 卸载插件。

    DROP EXTENSION oracle_fdw;

类型映射表格

在oracle_fdw插件中,PolarDB PostgreSQL版(兼容Oracle)与Oracle两种数据库的数据类型映射如下:

Oracle类型

可能的PostgreSQL类型

CHAR

char, varchar, text

NCHAR

char, varchar, text

VARCHAR

char, varchar, text

VARCHAR2

char, varchar, text, json

NVARCHAR2

char, varchar, text

CLOB

char, varchar, text, json

LONG

char, varchar, text

RAW

uuid, bytea

BLOB

bytea

BEILE

bytea (read-only)

LONG RAW

bytea

NUMBER

numeric, float4, float8, char, varchar, text

NUMBER(n,m) with m<=0

numeric, float4, float8, int2, int4, int8, boolean, char, varchar, text

FLOAT

numeric, float4, float8, char, varchar, text

BINARY_FLOAT

numeric, float4, float8, char, varchar, text

BINARY_DOUBLE

numeric, float4, float8, char, varchar, text

DATE

date, timestamp, timestamptz, char, varchar, text

TIMESTAMP

date, timestamp, timestamptz, char, varchar, text

TIMESTAMP WITH TIME ZONE

date, timestamp, timestamptz, char, varchar, text

TIMESTAMP WITH LOCAL TIME ZONE

date, timestamp, timestamptz, char, varchar, text

INTERVAL YEAR TO MONTH

interval, char, varchar, text

INTERVAL DAY TO SECOND

interval, char, varchar, text

XMLTYPE

xml, char, varchar, text

MDSYS.SDO_GEOMETRY

geometry (PostGIS)

相关参考

更多oracle_fdw高级使用方法,请参见oracle_fdw的官方文档