OceanBaseデータベースは、ストアドプロシージャ(独立したストアドプロシージャおよびパッケージ内のストアドプロシージャを含む)およびパッケージ内関数へのリモート呼び出し機能を提供しており、ユーザーがデータベースのPL(手続き言語)ストアドプロシージャと関数をリモートで実行することをサポートします。OceanBaseデータベースのリモート呼び出しがサポートするDBLinkタイプは以下のとおりです:
- OceanBaseデータベースOracleモードからOracleデータベースへのDBLink。
- OceanBaseデータベースOracleモードからOceanBaseデータベースOracleモードへのDBLink。
OceanBaseデータベースにおけるPLストアドプロシージャのリモート呼び出し構文は以下のとおりです:
CALL [pakage_name.]sp_name@dblink_name([parameter[,...]])
上記構文において、sp_name は呼び出されるストアドプロシージャ名を表します。@dblink_name はdblink名を指定し、呼び出される sp_name がリモートのストアドプロシージャであることを示します。pakage_name. はPLパッケージ名です。
以下の例では、リモートの dblink_test の proc1(スタンドアロン・プロシージャ)とPLパッケージ pl_pkg1 内のプロシージャ proc2 を呼び出しています。
CALL proc1@dblink_test(1);
CALL pl_pkg1.proc2@dblink_test(1);
PLストアドプロシージャのリモート呼び出しは、基本型の出力パラメータと入力パラメータをサポートします。サポートされている基本型には、文字列型(VARCHAR2、VARCHAR、CHAR など)、数値型(NUMBER、INT、INTEGER、FLOAT、DOUBLE など)、DATE 型、TIMESTAMP 型が含まれます。
以下の例では、PLストアドプロシージャをリモート呼び出し、入力パラメータを VARCHAR2 型としています。
DELIMITER /
DECLARE
v1 VARCHAR2(10);
BEGIN
proc3@dblink(1, v1);
END;
/
PLブロック内では、リモートdblink内のPLパッケージで定義されたデータ型を呼び出すこともできます。構文は以下のとおりです:
DECLARE
var_name package_name.type_name[@dblink_name]
BEGIN
...
END;
上記構文において、DECLARE は変数 var_name を定義します。そのデータ型は、dblink_name が指定するリモートdblinkライブラリ内の package_name が指定するパッケージで定義されたデータ型であり、データ型の名前は type_name です。
PLストアドプロシージャのリモート呼び出しは、パッケージで定義された複合データ型の出力パラメータと入力パラメータをサポートします。複合型とは、Record Type、Nested Table、Associate Arrayを指します。Record Typeの要素型は、上記で述べた基本型のみです。Nested TableとAssociate Arrayの要素型は、上記で述べた基本型とRecord Typeのみです。
OceanBaseデータベースのOracleモードにおけるDBLinkは、複雑なデータ型の転送をサポートします。このような型は通常、基本型(整数、文字列など)だけでなく、ネストされた複雑な構造も含みます。サポートされているネスト方法は以下のとおりです:
- record(basic):基本型のフィールドを含むレコード型。
- array(basic):要素が基本型の配列型。
- array(record(basic)):要素がレコード型であり、レコード型のフィールドが基本型の配列型。
ただし、リモートのOracleデータベースのバージョンが12c以下の場合、パッケージで定義されたデータ型は、パッケージ内の FUNCTION または PROCEDURE パラメータで定義されている型でなければなりません。パッケージ内で定義されているだけで、パッケージ内のいかなる FUNCTION または PROCEDURE パラメータでも使用されていない場合は、リモート呼び出しはサポートされません。リモートのOracleデータベースのより高いバージョンでは、この制限はありません。
以下の例では、リモートでパッケージ pkg1 及びそのデータ型を定義し、そのパッケージで定義されたデータ型をリモート呼び出しています。
/* リモートでパッケージ pkg1 を定義する */
DELIMITER /
CREATE OR REPLACE PACKAGE pkg1 AS
TYPE ty1 IS RECORD(c1 VARCHAR2(10), c2 INT);
TYPE ty2 IS TABLE OF VARCHAR2(10);
TYPE ty3 IS TABLE OF ty1;
TYPE ty4 IS TABLE OF VARCHAR2(10) INDEX BY PLS_INTEGER;
TYPE ty5 IS TABLE OF ty1 INDEX BY PLS_INTEGER;
TYPE ty6 IS TABLE OF VARCHAR2(10);
PROCEDURE proc4(param1 ty1, param2 ty2, param3 ty3 , param4 ty4, param5 ty5);
END;
/
/* パッケージ pkg1 内で定義されたデータ型をリモート呼び出す */
DECLARE
v1 pkg1.ty1@dblink_test;
v2 pkg1.ty2@dblink_test;
v3 pkg1.ty3@dblink_test;
v4 pkg1.ty4@dblink_test;
v4 pkg1.ty5@dblink_test;
BEGIN
pkg1.proc4@dblink_test(v1, v2, v3, v4, v5);
END;
/
/* ty6 は pkg1 の内部プロシージャ proc4 のパラメータリストに現れないため、以下のシナリオでのリモート呼び出しはサポートされません */
DECLARE
v1 pkg1.ty6@dblink_test;
BEGIN
NULL;
END;
OceanBaseデータベースは、リモートのPLストアドプロシージャやパッケージのシノニムを呼び出すこと、およびローカルでリモートのPLオブジェクトのシノニムを作成することもサポートしています。
説明
OceanBaseデータベースでは、ローカルシノニムを通じてDBLINKリモートのテーブルやビューにアクセスできます。
/* リモートのPLストアドプロシージャ proc5 のシノニムを作成する */
CREATE OR REPLACE SYNONYM syn_remote_p1 FOR proc5;
/* ローカルでリモートのPLストアドプロシージャ proc6 のシノニムを作成する
CREATE OR REPLACE SYNONYM syn_local_p1 FOR proc6@oci_link;
ユーザーは以下の例のコマンドを使用して、リモートのPLストアドプロシージャを呼び出すことができます。
CALL proc5@dblink_test(1);
CALL syn_remote_p1@dblink_test(1);
CALL syn_local_p1(1);