支持dblink调用远程数据库的存储过程与函数
- 功能描述
使Vastbase可以通过dblink调用远程数据库的存储过程与函数。
语法格式
select [schema_name.][package_name.]fune_name@dblink_name(arg_list); call [schema_name.][package_name.]fune_name@dblink_name(arg_list); exec [schema_name.][package_name.]fune_name@dblink_name(arg_list);
schema_name:Oracle数据库中函数或存储过程所属的模式名。可不填,不填时,默认访问dblink中指定的远端Oracle用户对应的模式
package_name:Oracle数据库中创建在package中的函数或存储过程,调用时需要指定好package名
func_name:Oracle数据库中函数或存储过程的名称
dblink_name:database link的唯一标识名称,即要访问Oracle数据库对应的database link
arg_list:参数列表
- 注意事项
- Oracle与Vastbase的函数调用存在区别:
1、Oracle函数或存储过程的out参数通过传入的变量返回;Vastbase函数或存储过程的out参数通过函数的return返回,若是有多个out参数,返回record类型。
2、Oracle的 out参数与return返回值分离,可分别返回不同信息;而Vastbase若是不显式指定return,则return返回out参数的信息,若是指定return,out参数会失效。
由此,在Vastbase侧远程调用时,将Oracle函数与存储过程的out参数与return值在Vastbase都通过return返回,有多个返回值就使用record存储。Oracle函数的return在record中以Oracle侧的函数名命名。其他out参数在record中命名与Oracle侧的函数(存储过程)参数名一致,方便结果获取。
- 在Vastbase侧@符号还有操作符功能,为解决语法冲突添加优先级开关
vastbase_prioritize_dblink_call,在postgresql.conf中配置,级别为PGC_USERSET,可由普通用户实时修改,为true则在语法同时匹配@操作符用法与dblink远程调用时,优先dblink远程调用,反之优先@操作符用法。默认为 false。
本功能基于jdbc_fdw实现,使用前需要安装jdbc_fdw插件。
函数(存储过程)参数及返回值暂只支持基本数据类型,数值、字符串及时间类型。
不支持的场景:
1、不支持访问远程Oracle包变量及常量(注:Oracle dblink也不支持)
2、不支持同义词方式使用
3、不支持访问内置函数及存储过程(注:Oracle dblink也不支持)
4、函数(存储过程)参数及返回值涉及自定义类型,游标的,不支持访问(注:Oracle dblink也不支持)
5、不支持访问管道及聚合函数(注:Oracle dblink也不支持)
- 示例
1、前置步骤
安装插件:
create extension jdbc_fdw;
创建dblink对象, jar包放置在/home/vastbase 目录下:
CREATE DATABASE LINK dblink_120_system CONNECT TO system IDENTIFIED BY 'root' USING jdbc_fdw(
url 'jdbc:oracle:thin:@//172.16.103.120:1521/utf8',
jarfile '/home/vastbase/ojdbc7.jar'
);
oracle侧函数定义:
create function ora_func01(param1 in number, param2 in out number, param3 out number)
return number
as
v_num1 number;
begin
v_num1 := param1 * param2;
param2 := 2;
param3 := 3;
return v_num1;
end;
/
2、远程存储过程或函数调用
--select调用
select ora_func@dblink_120_system(1,2);
--call/exc调用
call ora_func@dblink_120_system(1,2,null);
--匿名块调用
declare
v_num1 number;
v_num2 number;
v_res record;
begin
v_num1 := 2;
v_res := ora_func01@dblink_120_system (1, v_num1, v_num2);
raise notice '%', v_res.param2;
raise notice '%', v_res.param3;
raise notice '%', v_res.ora_func01; --对应ORACLE侧ora_func01的return值
--直接调用,本方法的out参数可以获取到结果值
ora_func01@dblink_120_system (1,v_num1, v_num2);
raise notice '%', v_num1;
raise notice '%', v_num2;
end;
/