IBM Support

[Db2] 定義が異なる表にデータ・コピーをする方法

Question & Answer


Question

定義が異なる表にデータ・コピーをする方法を教えてください。
 

Cause

 表の定義が同一の場合には  [Db2] 表をコピーする方法 で案内されている方法が有効です。
コピー元とコピー先の表定義が異なる場合、CURSOR LOAD でコピー先の表定義と互換性のあるカーソルを宣言してコピーできます。

Answer

コピー先の方が列数が多い場合、元表に存在しない列には NULL を指定したカーソルを宣言します。
例:定義の異なる ORGTAB 表から TGTTAB 表に、共通の EMPNO 列および DEPTNO 列のデータをコピーする場合
$ db2 describe table ORGTAB

                                Data type                     Column
Column name                     schema    Data type name      Length     Scale Nulls
------------------------------- --------- ------------------- ---------- ----- ------
EMPNO                           SYSIBM    INTEGER                      4     0 Yes   
DEPTNO                          SYSIBM    INTEGER                      4     0 Yes   

  2 record(s) selected.

$ db2 describe table TGTTAB
                                Data type                     Column
Column name                     schema    Data type name      Length     Scale Nulls
------------------------------- --------- ------------------- ---------- ----- ------
EMPNO                           SYSIBM    INTEGER                      4     0 Yes   
NAME                            SYSIBM    CHARACTER                   10     0 Yes   
DEPTNO                          SYSIBM    INTEGER                      4     0 Yes   
PHONENO                         SYSIBM    INTEGER                      4     0 Yes   

  4 record(s) selected.
コピーの実行例:
  1. コピー先の表にしかない列に対しては NULL を指定したカーソルを宣言します。
    db2 "declare cr cursor for select EMPNO, cast(null as char), DEPTNO, cast(null as int) from ORGTAB"
    注:TGTTAB 表にあって ORGTAB 表にない列を NULL 指定します。カーソルとコピー先の列タイプを一致させるため、暗黙的な型では互換性がないときは、コピー先の TGTTAB 表の列のタイプに合わせてキャストが必要です。上記の例では NULL に対して TGTTAB 表のタイプに合わせたキャストを行なっています。
  2. 宣言したカーソルをソースにコピー先へ LOAD を実行します。
    db2 "load from cr of cursor replace into TGTTAB"
コピーの結果:
カーソル LOAD 前の状態
$ db2 "select * from ORGTAB"

EMPNO       DEPTNO     
----------- -----------
          1         111
          2         222
          3         333

  3 record(s) selected.

  
$ db2 "select * from TGTTAB"

EMPNO       NAME       DEPTNO      PHONENO    
----------- ---------- ----------- -----------

  0 record(s) selected.
カーソル LOAD 後の状態
$ db2 "select * from TGTTAB"

EMPNO       NAME       DEPTNO      PHONENO    
----------- ---------- ----------- -----------
          1 -                  111           -
          2 -                  222           -
          3 -                  333           -

  3 record(s) selected.

運用上の考慮点

  • DECLARE CURSOR で宣言する照会の列タイプとコピー先の表の列タイプは互換性がなければなりません、ただし同一である必要はありません。
お問合せ先
技術的な内容に関して、パスポート・アドバンテージの契約のもと Db2 テクニカル・サポートへお問い合わせください。
Db2 テクニカル・サポート

[{"Type":"MASTER","Line of Business":{"code":"LOB10","label":"Data and AI"},"Business Unit":{"code":"BU058","label":"IBM Infrastructure w\/TPS"},"Product":{"code":"SSEPGG","label":"Db2 for Linux, UNIX and Windows"},"ARM Category":[{"code":"a8m500000008PlYAAU","label":"Database Objects-\u003ETables"}],"ARM Case Number":"","Platform":[{"code":"PF025","label":"Platform Independent"}],"Version":"All Versions"}]

Document Information

Modified date:
15 August 2023

UID

ibm17006491