CURSOR ファイル・タイプを使用したデータの移動

LOAD コマンドを使用する際に CURSOR ファイルを指定することにより、 中間エクスポート・ファイルを作成しなくても、 SQL 照会の結果を直接ターゲット表にロードすることができます。

さらに、SQL 照会内でニックネームを参照するか、DECLARE CURSOR ステートメント内で DATABASE オプションを使用するか、または API インターフェースの使用時に sqlu_remotefetch_entry メディア項目を使用することによって、別のデータベースからデータをロードすることができます。

CURSOR ファイル・タイプを使ってデータを移動するための方法は 3 つあります。 1 つ目の方法はコマンド行プロセッサー (CLP) を使用する方法で、2 つ目は API を使用する方法、3 つ目は ADMIN_CMD プロシージャーを使用する方法です。 CLP と ADMIN_CMD プロシージャーの主な違いが以下の表で略述されています。

表 1. CLP と ADMIN_CMD プロシージャーの違い。
相違 CLP ADMIN_CMD プロシージャー
構文 照会ステートメント、およびカーソルで使用されるソース・データベースは、LOAD コマンドの外部で、DECLARE CURSOR ステートメントを使って定義されます。 照会ステートメント、およびカーソルで使用されるソース・データベースは、LOAD コマンドの内部で、LOAD from ( DATABASE database-alias query-statement) を使って定義されます。
別のデータベースにアクセスするためのユーザー許可 現在接続しているものとは別のデータベースにデータがある場合、DATABASE キーワードを DECLARE CURSOR ステートメント内で使用する必要があります。 同じステートメントにユーザー ID とパスワードを指定することもできます。 DECLARE CURSOR ステートメントにユーザー ID およびパスワードを指定しない場合、ターゲット・データベースの接続に対して明示的に指定するユーザー ID およびパスワードがソース・データベースのアクセスに使用されます。 現在接続しているものとは別のデータベースにデータがある場合、照会ステートメントの前に LOAD コマンドで DATABASE キーワードを使用する必要があります。 ソース・データベースにアクセスするには、ターゲット・データベースの接続に対して明示的に指定したユーザー ID とパスワードが必要です。 ソース・データベースにユーザー ID またはパスワードを指定することはできません。 そのため、ターゲット・データベースとの接続確立時にユーザー ID およびパスワードを指定しなかった場合、または指定されたユーザー ID とパスワードを使ってソース・データベースに対して認証を行えない場合、ADMIN_CMD プロシージャーを使ってロードを実行することはできません。

CLP から LOAD FROM CURSOR 操作を実行するには、 まず SQL 照会に対してカーソルを宣言しなければなりません。 これが宣言されると、宣言されたカーソルの名前を cursorname として使用し、CURSOR をファイル・タイプとして使用して、 LOAD コマンドを発行することができます。

以下に例を示します。

  1. 以下の定義に従い、ソース表とターゲット表の両方が同じデータベースに存在すると仮定します。
    表 ABC.TABLE1 には次の 3 つの列があります。
    • ONE INT
    • TWO CHAR(10)
    • THREE DATE
    表 ABC.TABLE2 には次の 3 つの列があります。
    • ONE VARCHAR
    • TWO INT
    • THREE DATE
    以下の CLP コマンドを実行すると、 すべてのデータが ABC.TABLE1 から ABC.TABLE2 にロードされます。
    DECLARE mycurs CURSOR FOR SELECT TWO, ONE, THREE FROM abc.table1
       LOAD FROM mycurs OF cursor INSERT INTO abc.table2
    注: 上記の例は、CLP を介して SQL 照会からロードする方法を示しています。 ただし、db2Load API を介して SQL 照会からロードすることもできます。 sqlu_statement_entry 構造と SQLU_SQL_STMT メディア・タイプを使用するように sqlu_media_list 構造の piSourceList を定義し、 piFileType 値を SQL_CURSOR として定義します。
  2. 以下の定義に従い、ソース表とターゲット表がそれぞれ異なるデータベースに存在すると仮定します。
データベース「dbsource」の表 ABC.TABLE1 には次の 3 つの列があります。
  • ONE INT
  • TWO CHAR(10)
  • THREE DATE
データベース「dbtarget」の表 ABC.TABLE2 には次の 3 つの列があります。
  • ONE VARCHAR
  • TWO INT
  • THREE DATE
フェデレーションを可能にし、データ・ソース ('dsdbsource') をカタログした場合は、次の例に示すとおり、ソース・データベースに対してニックネームを宣言した後、このニックネームに対してカーソルを宣言し、FROM CURSOR オプションを指定して LOAD コマンドを呼び出すことができます。
CREATE NICKNAME myschema1.table1 FOR dsdbsource.abc.table1 
DECLARE mycurs CURSOR FOR SELECT TWO,ONE,THREE FROM myschema1.table1 
LOAD FROM mycurs OF cursor INSERT INTO abc.table2 
あるいは以下の例で示されているように、DECLARE CURSOR ステートメントの DATABASE オプションを使用することもできます。
DECLARE mycurs CURSOR DATABASE dbsource USER myuserid USING mypasswd 
FOR SELECT TWO,ONE,THREE FROM abc.table1 
LOAD FROM mycurs OF cursor INSERT INTO abc.table2

DECLARE CURSOR ステートメントの DATABASE オプション (ロード API 使用時の remotefetch メディア・タイプに相当する) を使用することには、ニックネームのアプローチに勝る利点があります。

パフォーマンス

remotefetch メディア・タイプを使ったデータのフェッチは、ロード操作と緊密に統合されています。 ニックネームのアプローチと比べて、レコード・フェッチのための遷移の層が少なくなります。 さらに、複数パーティション・データベースでソース表とターゲット表が全く均等に分散されている場合、ロード・ユーティリティーはデータのフェッチを並列的に処理します。これにより、パフォーマンスは向上します。

使いやすさ

フェデレーションの使用可能化、リモート・データ・ソースの定義、またはニックネームの宣言は不要です。 必要なのは DATABASE オプション (および必要な場合は USER および USING オプション) の指定だけです。

このメソッドはカタログされているデータベースで使用できますが、ニックネームの使用は、簡単にカタログできない各種データ・ソースからのフェッチのための堅固な機構を提供します。

この remotefetch 機能をサポートするために、ロード・ユーティリティーは SOURCEUSEREXIT 機能をサポートするインフラストラクチャーを利用します。 ロード・ユーティリティーは、アプリケーションとして実行されるプロセスを作成し、それによってソース・データベースへの接続を管理し、フェッチを実行します。 このアプリケーションはロード・ユーティリティーが実行されるトランザクションではなく、固有のトランザクションと関連付けられます。

注:
  1. 上記の例では、CLP を介して DECLARE CURSOR ステートメントの DATABASE オプションを使用することにより、カタログされているデータベースに対する SQL 照会からロードを行う方法を示しています。 ただし、カタログ式データベースに対する SQL 照会からのロードは、 db2LoadStruct 構造の piSourceList および piFileTypevalues を定義して、sqlu_remotefetch_entry メディア・エントリーと SQLU_REMOTEFETCH メディア・タイプをそれぞれ使用することにより、 db2Load API を介して行うこともできます。
  2. 上記の例で示したとおり、SQL 照会のソース列タイプはターゲット列タイプと互換性がなければなりませんが、同一である必要はありません。

制約事項

DATABASE オプションを使用して定義されているカーソルからロードする場合 (db2Load API で sqlu_remotefetch_entry メディア項目を使用する場合も同様)、次の制約事項が適用されます。
  1. SOURCEUSEREXIT オプションを並行して指定することはできません。
  2. METHOD N オプションはサポートされません。
  3. usedefaultsファイル・タイプ修飾子はサポートされていません。