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 (Standalone Procedure) および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);