DBLinkを作成した後、DBLinkを使用してリモートデータベースのデータを変更できます。現在、DBLinkを使用してOceanBaseデータベースのOracleモードおよびOracleデータベースにデータを書き込むことがサポートされています。
制限事項
DBLinkの書き込み機能を使用する場合、リモートデータベースがOceanBaseデータベースである場合は、リモートOceanBaseデータベースのバージョンがV4.1.0以降である必要があります。リモートデータベースがOracleデータベースの場合は、Oracle 11g以降のバージョンを使用することを推奨します。
DBLinkのデータ書き込み機能には、リバースリンクという特性があります。この特性は主に、リモートデータベースからローカルデータベースのオブジェクト(テーブル、ビュー、シノニムなど)にアクセスするために使用されます。DBLinkのデータ書き込み機能でリバースリンク特性を使用する必要がある場合は、DBLinkを作成する際にローカルデータベースの
ip、port、user_name、tenant_name、pass_wordなどの情報を提供する必要があります。具体的な操作方法および詳細な説明については、DBLinkの作成を参照してください。現在、リバースリンク特性はOceanBaseデータベースのOracleモード間のアクセスのみをサポートしており、OceanBaseデータベースのOracleモードからOracleデータベースへのアクセスはまだサポートされていません。
前提条件
DBLinkが作成済みであること。DBLinkの作成手順については、DBLinkの作成を参照してください。
OceanBase V4.2.1以降のバージョンでは、DBLink機能を使用してリモートのOracleデータベースにアクセスする場合、クラスタ内のすべてのOBServerノードにOCI-12.2をインストールおよび設定する必要があります。また、OceanBase V4.2.1未満のバージョンからV4.2.1以上のバージョンにアップグレードする場合も、既に設定されているOCI-11.2をOCI-12.2に再設定する必要があります。
OCI-12.2のインストールと設定の詳細な手順については、OCIのインストールと設定を参照してください。
注意事項
DBLinkを使用してリモートデータベースにデータを書き込む際、OceanBaseデータベースはローカルおよびリモートのXAトランザクションを自動的に開始します。ユーザーが手動で開始する必要はありません。
XAトランザクションの詳細については、XAトランザクションを参照してください。
DBLinkを使用してリモートデータベースにデータを書き込む操作が完了した後、ローカルおよびリモートのXAトランザクションをコミットまたはロールバックするために、手動で
COMMITまたはROLLBACKステートメントを使用する必要があります。その他のトランザクション制御ステートメントの詳細については、トランザクション管理の概要を参照してください。
DBLinkを使用してリモートデータベースにデータを書き込む際、
autocommit = Trueを設定してトランザクションの自動コミットを有効にすることは現在サポートされていません。また、DBLinkを使用してデータを書き込む操作でXAトランザクションが開始されると、システムはこのセッションのautocommit値を強制的にFalseに設定し、XAトランザクションがコミットまたはロールバックされるまでautocommitの元の値には戻りません。システム変数
autocommitは、トランザクションの自動コミットを有効にするかどうかを設定するために使用されます。デフォルト値はTrueです。その他のシステム変数autocommitの説明については、autocommitを参照してください。XAトランザクションが長時間を要すると予想される場合、XAトランザクションのタイムアウトによる予期しないエラーを防ぐために、
set ob_trx_timeout = 1000000000;ステートメントを使用して、トランザクションのタイムアウト時間を事前に延長できます。システム変数
ob_trx_timeoutは、トランザクションのタイムアウト時間を設定するために使用されます。デフォルト値は86400000000で、単位はマイクロ秒です。その他のシステム変数ob_trx_timeoutに関する情報については、ob_trx_timeoutを参照してください。DBLinkを使用してリモートUDF(ユーザー定義関数)を呼び出した後、SQLでは
COMMITステートメントを使用してローカルおよびリモートのXAトランザクションをコミットする必要があります。autocommit = Trueを設定してトランザクションの自動コミットを有効にすることは現在サポートされていません。PLでは、autocommit = Trueを設定することでトランザクションの自動コミットを有効にできます。
リモートデータベースのデータを変更する
DBLinkを使用してリモートデータベースのデータを変更する操作には、データの挿入、更新、置換、削除などが含まれ、主にINSERT、UPDATE、MERGE INTO、DELETEの4種類のDMLステートメントで実現されます。
データの挿入
DBLinkを使用してテーブルにデータを挿入する基本構文は以下のとおりです:
obclient> INSERT INTO table_name@dblink_name (list_of_columns) VALUES (list_of_values);
関連パラメータの説明は以下のとおりです:
table_name@dblink_name:table_nameは変更対象のリモートデータベースのテーブル名を表します。dblink_nameはDBLink名を表します。list_of_columns:テーブルに挿入するデータの列を指定します。list_of_values:list_of_columnsで指定された列に対応する値で、一対一で対応していなければなりません。
DBLinkを使用してリモートデータベースのテーブル t1 に行データ (11,11) を挿入する例は以下のとおりです:
obclient> SELECT * FROM t1@ob_dblink;
+------+------+
| C1 | C2 |
+------+------+
| 1 | 1 |
+------+------+
1 row in set
obclient> INSERT INTO t1@ob_dblink VALUES (11,11);
Query OK, 1 row affected
obclient> SELECT * FROM t1@ob_dblink;
+------+------+
| C1 | C2 |
+------+------+
| 1 | 1 |
| 11 | 11 |
+------+------+
2 rows in set
DBLinkを使用してリモートデータベースのテーブルにデータを挿入する操作は、直接テーブルにデータを挿入する操作と似ています。ステートメント内で操作対象のテーブル名の後に @dblink_name の接尾辞を追加するだけです。テーブルへのデータ挿入の詳細な操作については、データの挿入を参照してください。
その他の INSERT ステートメントの詳細な使用方法と説明については、INSERTを参照してください。
ローカルテーブルデータをリモートテーブルに挿入する
DBLinkを使用してローカルテーブルデータをリモートテーブルに書き込む基本構文は以下のとおりです:
INSERT INTO table_name@dblink_name[(list_of_columns)] SELECT * FROM table_name_list [WHERE query_condition];
table_name_list:
table_name_local [, table_name_local ...] [, table_name_dblink@dblink_name_select ...]
関連パラメータの説明は以下のとおりです:
table_name@dblink_name:ターゲットテーブルの名前とDBLinkの名前。table_name:データを挿入する対象のリモートテーブルの名前を表します。dblink_name:ローカルデータベース上に作成された、リモートデータベースを指すデータベースリンク(DBLink)の名前を表します。
list_of_columns:オプションで、ターゲットテーブルに挿入するデータの列のリストを指定します。省略した場合、SQLステートメントはソーステーブルの列順序とターゲットテーブルの列をマッチングし、ターゲットテーブルのSELECT句で選択されたすべての列を含みます。table_name_local:ローカルデータベース内のソーステーブル名を表します。table_name_dblink@dblink_name:DBLinkを介してリモートデータベースから選択されるソーステーブル。table_name_dblink:リモートソーステーブルの名前を表します。dblink_name_select:リモートソーステーブルにアクセスするために使用されるDBLinkの名前を表します。
WHERE query_condition:オプションで、SELECTステートメントの条件部分を表します。query_conditionは、ソーステーブルから挿入操作を実行するために選択される行を指定します。
例:
ローカルテーブル
tbl1のデータを確認します。obclient [SYS]> SELECT * FROM tbl1;実行結果は次のとおりです:
+------+------+ | COL1 | COL2 | +------+------+ | 1 | AAA | | 2 | BBB | | 3 | CCC | +------+------+ 3 rows in setリモートデータベースAのテーブル
a_tbl1のデータを確認します。obclient [SYS]> SELECT * FROM a_tbl1@ob_dblink_a;実行結果は次のとおりです:
Empty setリモートデータベースBのテーブル
b_tbl1のデータを確認します。obclient [SYS]> SELECT * FROM b_tbl1@ob_dblink_b;実行結果は次のとおりです:
+------+------+ | COL1 | COL2 | +------+------+ | 1 | AA | | 2 | BBB | | 3 | CC | +------+------+ 3 rows in setデータベースリンク
ob_dblink_bを使用してリモートデータベーステーブルb_tbl1にアクセスし、ローカルテーブルtbl1からb_tbl1のcol1およびcol2列とマッチするレコードを選択します。その後、これらの選択されたcol1およびcol2値を別のデータベースリンクob_dblink_aを介してリモートデータベースのテーブルa_tbl1に挿入します。obclient [SYS]> INSERT INTO a_tbl1@ob_dblink_a SELECT t1.col1, t1.col2 FROM tbl1 t1, b_tbl1@ob_dblink_b t2 WHERE t1.col1 = t2.col1 AND t1.col2 = t2.col2;実行結果は次のとおりです:
Query OK, 1 row affected再度リモートデータベースAのテーブル
a_tbl1のデータを確認します。obclient [SYS]> SELECT * FROM a_tbl1@ob_dblink_a;実行結果は次のとおりです:
+------+------+ | COL1 | COL2 | +------+------+ | 2 | BBB | +------+------+ 1 row in set
データの更新
DBLinkを使用してテーブルデータを更新する基本構文は以下のとおりです:
obclient> UPDATE table_name@dblink_name
SET column_name = value [, column_name = value]...
[WHERE condition];
関連パラメータの説明は以下のとおりです:
table_name@dblink_name:table_nameは変更対象のリモートデータベースのテーブル名を表します。dblink_nameはDBLink名を表します。column_name = value [, column_name = value]:更新対象の列を指定します。等号(=)の後ろのvalueが更新後の目標値です。WHERE condition:条件句は、更新される行が満たす必要がある条件を指定します。条件句がない場合は、更新対象のテーブルの該当列のすべてのレコードが更新されます。
DBLinkを使用して、リモートデータベースのテーブル t2 内の C1 列の値を 3 に変更する例は以下のとおりです:
obclient> SET ob_trx_timeout = 1000000000;
Query OK, 0 rows affected
obclient> SELECT * FROM t2@ob_dblink;
+------+------+
| C1 | C2 |
+------+------+
| 2 | 2 |
+------+------+
1 row in set
obclient> UPDATE t2@ob_dblink SET C1 = 3;
Query OK, 1 row affected
obclient> SELECT * FROM t2@ob_dblink;
+------+------+
| C1 | C2 |
+------+------+
| 3 | 2 |
+------+------+
1 rows in set
DBLinkを使用してリモートデータベースのテーブルデータを更新する操作は、直接テーブルデータを更新する操作と似ています。ステートメント内で操作対象のテーブル名の後に @dblink_name の接尾辞を追加するだけです。テーブルデータの更新の詳細な操作については、データの更新を参照してください。
その他の UPDATE ステートメントの詳細な使用方法と説明については、UPDATEを参照してください。
ローカルテーブルデータをリモートテーブルに更新する
例:
ローカルテーブル
tbl1のデータを確認します。obclient [SYS]> SELECT * FROM tbl1;実行結果は次のとおりです:
+------+------+ | COL1 | COL2 | +------+------+ | 1 | AAA | | 2 | BBB | | 3 | CCC | +------+------+ 3 rows in setリモートデータベースBのテーブル
b_tbl1のデータを確認します。obclient [SYS]> SELECT * FROM b_tbl1@ob_dblink_b;実行結果は次のとおりです:
+------+------+ | COL1 | COL2 | +------+------+ | 1 | AA | | 2 | BBB | | 3 | CC | +------+------+ 3 rows in setDBLink
ob_dblink_bを使用して、リモートテーブルb_tbl1を更新し、そのcol2列の値をローカルテーブルtbl1のcol1列の値と一致する行のcol2値に変更します。ただし、tbl1にマッチするcol1値が存在するb_tbl1の行のみを更新します。UPDATE b_tbl1@ob_dblink_b t1 SET t1.col2 = (SELECT t2.col2 FROM tbl1 t2 WHERE t2.col1 = t1.col1) WHERE EXISTS (SELECT 1 FROM tbl1 t2 WHERE t2.col1 = t1.col1);実行結果は次のとおりです:
Query OK, 3 rows affected Rows matched: 0 Changed: 0 Warnings: 0再びリモートデータベースBのテーブル
b_tbl1のデータを確認します。obclient [SYS]> SELECT * FROM b_tbl1@ob_dblink_b;実行結果は次のとおりです:
+------+------+ | COL1 | COL2 | +------+------+ | 1 | AAA | | 2 | BBB | | 3 | CCC | +------+------+ 3 rows in set
データの置換
DBLinkを使用してテーブルデータを置き換える基本構文は以下のとおりです:
obclient> MERGE INTO table_name@dblink_name alias1
USING (table|view|sub_query) alias2
ON (join condition)
WHEN MATCHED THEN
UPDATE table_name
SET col1 = col1_val,
col2 = col2_val
WHEN NOT MATCHED THEN
INSERT (column_list) VALUES (column_values);
関連パラメータの説明は以下のとおりです:
MERGE INTO table_name@dblink_name alias1:変更対象のリモートデータベースのテーブル名とエイリアスを指定します。dblink_nameはDBLink名を表します。USING (table|view|sub_query) alias2:ソーステーブル(ビュー、サブクエリ)とエイリアスを指定します。ON (join condition):判断条件を指定します。WHEN MATCHED THEN UPDATE table_name SET col1 = col_val1 , col2 = col2_val:条件が一致した場合、UPDATEステートメントを実行します。WHEN NOT MATCHED THEN INSERT (column_list) VALUES (column_values);:条件が一致しない場合、INSERTステートメントを実行します。
MERGE INTO ステートメントを使用してデータを置き換える際、ソーステーブルのレコードがターゲットテーブルに存在しない場合は、ターゲットテーブルにデータを挿入します。ソーステーブルのレコードがターゲットテーブルに存在する場合は、レコードを更新します。
DBLinkを使用してリモートデータベースのテーブル t3 のデータを置き換える例は以下のとおりです:
obclient> SELECT * FROM t3@orcl_dblink;
+------+------+
| C1 | C2 |
+------+------+
| 3 | 3 |
| 4 | 4 |
+------+------+
2 row in set
obclient> SELECT * FROM t4;
+------+------+
| C1 | C2 |
+------+------+
| 5 | 5 |
| 6 | 6 |
+------+------+
2 row in set
obclient> MERGE INTO t3@orcl_dblink a
USING (SELECT C1,C2 FROM t4 ) b
ON (a.C1 = b.C1)
WHEN MATCHED THEN
UPDATE SET a.C2 = b.C2
WHEN NOT MATCHED THEN
INSERT (a.C1,a.C2) VALUES(b.C1, b.C2);
Query OK, 2 rows affected
obclient> SELECT * FROM t3@orcl_dblink;
+------+------+
| C1 | C2 |
+------+------+
| 3 | 3 |
| 4 | 4 |
| 5 | 5 |
| 6 | 6 |
+------+------+
4 row in set
DBLinkを使用してリモートデータベースのテーブルデータを置き換える操作は、直接データを置き換える操作と似ています。ステートメント内で操作対象のテーブル名の後に @dblink_name サフィックスを追加するだけです。テーブルデータの置き換えに関する詳細な操作については、データの置き換えを参照してください。
MERGE INTO ステートメントの詳細な使用方法と説明については、MERGEを参照してください。
ローカルテーブルデータをリモートテーブルデータに置き換える
例:
ローカルテーブル
tbl1のデータを確認します。obclient [SYS]> SELECT * FROM tbl1;実行結果は次のとおりです:
+------+------+ | COL1 | COL2 | +------+------+ | 1 | AAA | | 2 | BBB | | 3 | CCC | +------+------+ 3 rows in setリモートデータベースBのテーブル
b_tbl1のデータを確認します。obclient [SYS]> SELECT * FROM b_tbl1@ob_dblink_b;実行結果は次のとおりです:
+------+------+ | COL1 | COL2 | +------+------+ | 1 | AAA | | 2 | B2 | | 5 | E5 | +------+------+ 3 rows in setDBLink
ob_dblink_bを使用して、リモートテーブルb_tbl1を更新し、そのcol2列の値をローカルテーブル(ソーステーブル)tbl1のcol1列の値と一致する行のcol2値に変更します。ただし、tbl1にマッチするcol1値が存在するb_tbl1の行のみを更新します。ソーステーブルtbl1にcol1値に基づいてターゲットテーブルb_tbl1にマッチする行がない場合は、INSERT操作を実行して、ソーステーブルtbl1の対応する列からcol1とcol2の値を取得し、新しい行をターゲットテーブルb_tbl1に挿入します。MERGE INTO b_tbl1@ob_dblink_b t1 USING tbl1 t2 ON (t2.col1 = t1.col1) WHEN MATCHED THEN UPDATE SET t1.col2 = t2.col2 WHEN NOT MATCHED THEN INSERT (t1.col1, t1.col2) VALUES(t2.col1, t2.col2);実行結果は次のとおりです:
Query OK, 3 rows affected再びリモートデータベースBのテーブル
b_tbl1のデータを確認します。obclient [SYS]> SELECT * FROM b_tbl1@ob_dblink_b;実行結果は次のとおりです:
+------+------+ | COL1 | COL2 | +------+------+ | 1 | AAA | | 2 | BBB | | 5 | E5 | | 3 | CCC | +------+------+ 4 rows in set
データの削除
DBLinkを使用してテーブルデータを削除する基本構文は以下のとおりです:
obclient> DELETE FROM table_name@dblink_name [WHERE condition];
関連パラメータの説明は以下のとおりです:
table_name@dblink_name:table_nameは変更対象のリモートデータベースのテーブル名を表します。dblink_nameはDBLink名を表します。WHERE condition:条件句は、削除するデータが満たす必要がある条件を指定します。条件句がない場合は、テーブル全体の削除が実行されます。
DBLinkを使用して、リモートデータベースのテーブル t5 から C2 = 7 のデータ行を削除する例は以下のとおりです:
obclient> SET ob_trx_timeout = 1000000000;
Query OK, 0 rows affected
obclient> SELECT * FROM t5@orcl_dblink;
+------+------+
| C1 | C2 |
+------+------+
| 7 | 7 |
| 8 | 8 |
+------+------+
2 row in set
obclient> DELETE FROM t5@orcl_dblink WHERE C2 = 7;
Query OK, 1 row affected
obclient> SELECT * FROM t5@orcl_dblink;
+------+------+
| C1 | C2 |
+------+------+
| 8 | 8 |
+------+------+
1 row in set
DBLinkを使用してリモートデータベースのテーブルデータを削除する操作は、直接テーブルデータを削除する操作と似ています。ステートメント内で操作対象のテーブル名の後に @dblink_name サフィックスを追加するだけです。テーブルデータの詳細な操作については、データの削除を参照してください。
その他の DELETE ステートメントの詳細な使用方法と説明については、DELETEを参照してください。
ローカルテーブルデータに基づいてリモートテーブルデータを削除する
例:
ローカルテーブル
tbl1のデータを確認します。obclient [SYS]> SELECT * FROM tbl1;実行結果は次のとおりです:
+------+------+ | COL1 | COL2 | +------+------+ | 1 | AAA | | 2 | BBB | | 3 | CCC | +------+------+ 3 rows in setリモートデータベースAのテーブル
a_tbl1のデータを確認します。obclient [SYS]> SELECT * FROM a_tbl1@ob_dblink_a;実行結果は次のとおりです:
+------+------+ | COL1 | COL2 | +------+------+ | 2 | BBB | | 1 | AA1 | | 2 | BB2 | | 3 | CC3 | +------+------+ 4 rows in setリモートテーブル
a_tbl1から、ローカルテーブルtbl1内でcol1およびcol2列の値と一致するすべての行を削除します。DELETE FROM a_tbl1@ob_dblink_a t1 WHERE EXISTS (SELECT 1 FROM tbl1 t2 WHERE t2.col1 = t1.col1 AND t2.col2 = t1.col2 );実行結果は次のとおりです:
Query OK, 1 row affected再度リモートデータベースAのテーブル
a_tbl1のデータを確認します。obclient [SYS]> SELECT * FROM a_tbl1@ob_dblink_a;実行結果は次のとおりです:
+------+------+ | COL1 | COL2 | +------+------+ | 1 | AA1 | | 2 | BB2 | | 3 | CC3 | +------+------+ 3 rows in set
DBLinkの書き込みはSAVEPOINT機能をサポートしています
説明
DBLinkの書き込みは SAVEPOINT 機能をサポートしており、トランザクションを指定されたセーブポイントまでロールバックすることを許可します。
例:
リモートデータベースに空のテーブル tbl1 があります。次のSQLステートメントを使用して、DBLinkがトランザクションを指定されたセーブポイントまでロールバックすることを示します。
リモートテーブル
tbl1に行1を挿入します。INSERT INTO tbl1@dblink_o2 VALUES(1);sp1という名前のセーブポイントを作成します。SAVEPOINT sp1;リモートテーブル
tbl1に行2を挿入します。INSERT INTO tbl1@dblink_o2 VALUES(2);sp2という名前のセーブポイントを作成します。SAVEPOINT sp2;変更を
sp1までロールバックします。ROLLBACK TO sp1;リモートテーブル
tbl1に行3を挿入します。INSERT INTO tbl1@dblink_o2 VALUES(3);トランザクションをコミットします。
COMMIT;テーブル
tbl1のデータを照会します。obclient [SYS]> SELECT * FROM tbl1@dblink_o2;実行結果は次のとおりです:
+------+ | C1 | +------+ | 1 | | 3 | +------+ 2 rows in set
関連ドキュメント
DBLinkに関するその他の操作については、以下の情報を参照してください: