VastbaseG100

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

Menu

支持dblink调用远程数据库的存储过程与函数

  1. 功能描述

使Vastbase可以通过dblink调用远程数据库的存储过程与函数。

  1. 语法格式

    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:参数列表

  1. 注意事项
  • 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. 示例

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;
/
resizeTimer = setTimeout(function(){ refresh(); } , 500); });