VastbaseG100

基于openGauss内核开发的企业级关系型数据库。

Menu

JDBC_FDW

功能描述

支持基于JDBC驱动的FDW,可以通过不同数据源的JDBC驱动在外部表访问数据。

  • 支持DATABASE LINK访问Oracle中数据库的Sequence序列的值。

    • 支持通过NEXTVAL获取下一个序列值。
    • 支持通过CURRVAL获取当前序列值。
  • 支持DATABASE LINK与synonym结合访问Oracle的存储过程。

    • 支持远程调用无参的存储过程。

    • 支持调用带输入参数的存储过程。

    • 支持调用带out参数的存储过程。

    • 传入参数和out参数,支持的数据类型如下:

      数据类型名称 数据类型
      数字类型 NUMBER
      变长字符串类型 VARCHAR2,NVARCHAR2
      VARCHAR,NVARCHAR
      定长字符串类型 CHAR,NCHAR
      单精度精度二进制浮点类型 BINARY_FLOAT
      双精度二进制浮点类型 BINARY_DOUBLE
      二进制数据类型 RAW
      二进制大对象类型 BLOB
      字符大对象类型 CLOB
      XML数据类型 XMLType
      日期时间类型 DATE
      时间戳数据类型 TIMESTAMP, TIMESTAMP WITH TIME ZONE
      本地时间戳数据类型 TIMESTAMP WITH LOCAL TIME ZONE
  • 支持DATABASE LINK与synonym结合访问Oracle的自定义函数。

    • 支持远程调用无参的自定义函数。
    • 支持远程调用带输入参数的自定义函数。
    • 支持远程调用out参数的自定义函数。
    • 支持调用的函数return是%rowtype行数据类型。
    • 传入参数和out参数和return函数返回,支持的数据类型如下:

      数据类型名称 数据类型
      数字类型 NUMBER
      变长字符串类型 VARCHAR2,NVARCHAR2
      VARCHAR,NVARCHAR
      定长字符串类型 CHAR,NCHAR
      单精度精度二进制浮点类型 BINARY_FLOAT
      双精度二进制浮点类型 BINARY_DOUBLE
      二进制数据类型 RAW
      二进制大对象类型 BLOB
      字符大对象类型 CLOB
      XML数据类型 XMLType
      日期时间类型 DATE
      时间戳数据类型 TIMESTAMP, TIMESTAMP WITH TIME ZONE
      本地时间戳数据类型 TIMESTAMP WITH LOCAL TIME ZONE
  • 支持DATABASE LINK与synonym结合访问Oracle的包。

  • 支持在远端执行JOIN、AGG、SORT操作。

  • 支持通过analyze tablename@dblinkname语法可获得更多建议,优化建议仅供参考。

前置条件

1、获取驱动包ojdbc7.jar、xdb.jar、xmlparserv2.jar、orai18n.jar,将其放置到$GAUSSHOME/lib/postgresql/下并对每一个jar包授权。

chmod 777 $GAUSSHOME/lib/postgresql/驱动包名称

2、安装JDK1.8,并配置好JAVA_HOME环境变量。

3、数据库环境变量LD_LIBRARY_PATH动态库路径加入JAVA_HOME配置。通过如下命令配置环境变量:

  • x86:

    export LD_LIBRARY_PATH=$GAUSSHOME/jre/lib/amd64/server/:$LD_LIBRARY_PATH
    
  • ARM:

    export LD_LIBRARY_PATH=$GAUSSHOME/jre/lib/aarch64/server/:$LD_LIBRARY_PATH
    

4、修改postgresql.conf参数,将jdbc_fdw配置到shared_preload_libraries参数中。

shared_preload_libraries = 'jdbc_fdw'

5、重启数据库实例。

示例

示例1: 创建jdbc_fdw连接。

1、加载jdbc_fdw扩展。

create extension jdbc_fdw;

2、Oracle远端创建表并插入数据。

create table emp_fdw(empno int,ename varchar(30));
insert into emp_fdw values(1,'foo');
insert into emp_fdw values(2,'bar');

3、创建连接,其中服务器连接选项以实际情况为准。

create server ora_jdbc foreign data wrapper jdbc_fdw options(
drivername 'oracle.jdbc.driver.OracleDriver',
url 'jdbc:oracle:thin:@//172.16.103.104:1521/orcl',
querytimeout '100',
jarfile  '/home/vastbase2211/local/vastbase/lib/postgresql/ojdbc7.jar',
maxheapsize '200'
);

4、修改vbadmin用户密码。

alter role vbadmin identified by 'Vbase@admin';

5、创建到oracle的映射。

create user mapping for vbadmin server ora_jdbc options(username 'system',password 'root');

6、创建需要访问的oracle中对应表的结构。

create foreign table emp_fdw_ora(empno int,ename varchar(30)) server ora_jdbc options(table_name 'EMP_FDW');

7、将权限赋予emp_fdw_ora。

grant all on emp_fdw_ora to vbadmin;

8、查看外部表。

\c - vbadmin
SELECT * FROM emp_fdw_ora;

当结果显示如下信息,则表示外部表访问成功。

id | info
----+-----------
1 | bar
2 | foo
(2 row)

示例2: 远程访问Oracle函数。

1、加载jdbc_fdw扩展。

create extension jdbc_fdw;

2、在远端oracle中创建对应的表和存储过程。

create or replace function ora_func01(param1 in binary_float,param2 in out binary_float ,param3 out binary_float)
return binary_float
as
v_num1 binary_float;
begin
v_num1 :=param1*param2;
param2:=2;
param3:=3;
return v_num1;
end;
/

3、在本地vastbase中创建dblink。

CREATE public DATABASE LINK dblink_104 CONNECT TO SYSTEM IDENTIFIED BY 'root' USING jdbc_fdw(
url 'jdbc:oracle:thin:@//172.16.103.104:1521/orcl',
jarfile '/home/vastbase2211/local/vastbase/lib/postgresql/ojdbc7.jar'
);

4、在vastbase中创建同义词进行访问Oracle的带参数的函数。

create SYNONYM syn_f01 for ora_func01@dblink_104;

5、在本地Vastbase直接调用函数。

call ora_func01@dblink_104(1,2,null);

返回结果为:

param2  |  param3  |  ora_func01
--------+----------+-------------
  2     |    3     |     2
(1 row)

6、在Vastbase中通过调用同义词调用函数(补全return参数)。

call syn_f01(1,2,null,null);

返回结果为:

param2  |  param3  |  ora_func01
--------+----------+-------------
  2     |    3     |     2
(1 row)