JDBC_FDW
功能描述
支持基于JDBC驱动的FDW,可以通过不同数据源的JDBC驱动在外部表访问数据。
支持dblink访问Oracle中数据库的Sequence序列的值。
- 支持通过NEXTVAL获取下一个序列值。
- 支持通过CURRVAL获取当前序列值。
支持dblink与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
支持dblink与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
支持dblink与synonym结合访问Oracle的包。
支持在远端执行JOIN、AGG、SORT操作。
支持通过
analyze tablename@dblinkname
语法可获得更多建议,优化建议仅供参考。
前置条件
1、获取驱动包ojdbc7.jar,并将其放置到$GAUSSHOME/lib/postgresql/下。
chmod 777 $GAUSSHOME/lib/postgresql/ojdbc7.jar
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)