既存の Db2 データの Unicode への変換

データベースおよびアプリケーションが各国語データを扱う場合は、Db2 データを Unicode に変換することを検討してください。 Unicode を使用すると、文字変換が行われなくなるため、パフォーマンスが向上し、データ保全性を確保するのに役立つことがあります。 ただし、Unicode データはより多くのスペースを必要とする場合があります。 データによっては、これらの文字のサイズが EBCDIC または ASCII 文字の 2 倍から 3 倍になる可能性があります。

始める前に

既存の Db2 データを Unicode に変換する前に、以下の項目について考慮してください。
  • すべての関連するアプリケーションとツールに対する影響を考慮します。 例えば、 グリーンスクリーンアプリケーションへの影響を考えてみましょう。
  • データが最初に作成された場所を理解します。 データが既に元のフォーマットから変換されている場合は、置換文字が含まれている可能性があります。 その場合は、データを元のフォーマットに変換し直してから、Unicode に変換します。

    例えば、データを EBCDIC から Unicode に変換し、データが最初は ASCII であったと仮定します。 データを元の ASCII フォーマットに変換してから、Unicode に変換しなければならない可能性があります。 元の ASCII データで EBCDIC への往復変換を行っていて、すべての文字が EBCDIC には存在しない場合は、この追加の変換を行います。 例えば、データを ASCII CCSID 1252 から EBCDIC CCSID 37 に変換したと仮定します。 CCSID 1252 には、CCSID 37 には存在しない文字が含まれています。 そのため、EBCDIC データには、ASCII には存在しても EBCDIC には存在しない文字の代わりに制御文字が含まれています。 ( 往復変換における商標記号™の例を考えてみましょう。) Unicode に変換する前にデータを最初に ASCII に変換すると、元の値がリカバリーされます。

プロシージャー

既存の Db2 データを Unicode に変換する場合。

  1. このデータに対して、1つまたは複数のUnicodeテーブルを作成します
  2. 既存のデータを新規の Unicode 表にロードするには、次のいずれかの手法を使用してください。 Db2 データを読み込む際にUnicodeに変換します。
    • INSERT ステートメントは副選択とともに使用します。
      INSERT INTO UNICODETABLE
           SELECT *
           FROM EBCDICTABLE;
      この例では、UNICODETABLE および EBCDICTABLE の両方の列に互換性があることを確認します。 例えば、EBCDICTABLE の 1 番目の列が文字の列の場合、UNICODETABLE の 1 番目の列も文字の列でなければなりません。EBCDICTABLE の 2 番目の列が数値列の場合、UNICODETABLE の 2 番目の列も数値列でなければなりません。
    • UNLOAD ユーティリティーを使用して、データを現状のまま EBCDIC または ASCII データ・セットにアンロードします。 次に、新規 Unicode 表へのデータの LOAD を実行します。 LOAD ステートメントに適切なコード化スキーム・キーワード (ASCII、EBCDIC、または CCSID) を指定してください。
      推奨: UNLOADユーティリティのPUNCHDDNオプションを使用して、 Db2 がデータをアンロードする際に、対応するLOADユーティリティステートメントを生成します。
      以下に示すサンプル JCL は、次のアクションを実行します。
      • STEP1 で、2 つの表が作成され、データが取り込まれます。 T1 は Unicode 表です。 T2 は EBCDIC 表です。
      • STEP2 で、EBCDIC 表 T2 からデータがアンロードされます。 UNLOAD ステートメントには PUNCHDDN オプションが指定されています。 このオプションにより、(SYSPUNCH データ・セット内に) データを元の表 T2 にロードして戻すための対応する LOAD ステートメントが生成されます。 このSYSPUNCHファイルを使用して、テーブル T1 にロードされていないデータをロードするには、SYSPUNCHまたはJCLを変更する必要があります。
      • STEP3 で、STEP2 でアンロードされたデータが Unicode 表 T1 にロードされます。 カタログでテーブルがUnicodeとして定義されているため、データが読み込まれる際にUnicodeに変換されます。
      • STEP4 で、両方の表の現行データが出力されます。
      //STEP1    EXEC  TSOBATCH
      //SYSTSIN  DD *
      DSN S(SSTR) R(1) T(1)
      RUN PROGRAM DSNTEP2 PLAN(DSNTEPD1)
      END
      //SYSIN DD *
          DROP DATABASE DB1;
          COMMIT;
          CREATE DATABASE DB1 CCSID UNICODE;
          CREATE TABLESPACE TS1 IN DB1;
          CREATE TABLE T1 (C1 CHAR(7)) IN DB1.TS1;
       
          DROP DATABASE DB2;
          COMMIT;
          CREATE DATABASE DB2 CCSID EBCDIC;
          CREATE TABLESPACE TS2 IN DB2;
          CREATE TABLE T2 (C1 CHAR(7)) IN DB2.TS2;
          INSERT INTO T2 VALUES ('ABCDEFG');
       
          INSERT INTO T1 (SELECT * FROM T2);
       
          SELECT * FROM SYSADM.T1;
          SELECT * FROM SYSADM.T2;
      /*
      //***************************************************
      //STEP2    EXEC DSNUPROC,UID='SMPLUNLD',UTPROC='',SYSTEM='SSTR'
      //SYSPRINT DD SYSOUT=*
      //SYSUT1   DD UNIT=SYSDA,SPACE=(CYL,(5,5),RLSE)
      //SYSUT2   DD UNIT=SYSDA,SPACE=(CYL,(5,5),RLSE)
      //SORTOUT  DD UNIT=SYSDA,SPACE=(CYL,(5,5),RLSE)
      //SYSIN    DD *
        TEMPLATE REC DSN TEST123.STEP2.UNLOAD.SYSREC SPACE(15,5)
                 CYL UNIT(3390) VOLUMES(SCR03)
        TEMPLATE CARD DSN TEST123.STEP2.UNLOAD.SYSPUNCH SPACE(15,5)
                 CYL UNIT(3390) VOLUMES(SCR03)
        UNLOAD DATA FROM TABLE SYSADM.T2
           (C1  CHAR(7))
               UNLDDN REC PUNCHDDN CARD SHRLEVEL CHANGE
      /*
      /*
      //**********************************************************************
      //* DSNUPROC UTILITY STEP
      //**********************************************************************
      //STEP3    EXEC DSNUPROC,UID='LI848.LOAD1',TIME=1440,
      //         UTPROC='',
      //         SYSTEM='SSTR',DB2LEV=DB2A
      //SYSUT1   DD DSN=TEST123.STEP3.LOAD.SYSUT1,DISP=(MOD,DELETE,CATLG),
      //         UNIT=SYSDA,SPACE=(4000,(20,20),,,ROUND)
      //SORTOUT  DD DSN=TEST123.STEP3.LOAD.SORTOUT,DISP=(MOD,DELETE,CATLG),
      //         UNIT=SYSDA,SPACE=(4000,(20,20),,,ROUND)
      //SYSMAP   DD DSN=TEST123.STEP3.LOAD.SYSMAP,DISP=(MOD,DELETE,CATLG),
      //         UNIT=SYSDA,SPACE=(4000,(20,20),,,ROUND)
      //SYSIN    DD *
      TEMPLATE CWPH5APV
           DSN('TEST123.STEP2.UNLOAD.SYSREC')
           DISP(OLD,KEEP,KEEP)
      LOAD DATA INDDN CWPH5APV LOG NO  RESUME YES
        EBCDIC CCSID(00037,00000,00000)
       INTO TABLE
       "SYSADM".
       "T1"
       WHEN(00001:00002) = X'0006'
       NUMRECS                    1
       ( "C1"
        POSITION(  00004:00010) CHAR MIXED(007)
                                NULLIF(00003)=X'FF'
       )
      //********************************************************************
      //STEP4    EXEC TSOBATCH,DB2LEV=DB2A
      //SYSTSIN  DD *
      DSN SYSTEM(SSTR)
      RUN PROGRAM DSNTEP2 PLAN(DSNTEPD1))
      //SYSIN    DD *
      SELECT * FROM SYSADM.T1;
      SELECT * FROM SYSADM.T2;
      /*
    • 動的 SQL SELECT ステートメントの出力を新規の Unicode 表にロードするには、クロスローダー機能を使用します。 SELECT ステートメントでは、表全体が選択されます。 次の例では、表 T1 が Unicode であり、表 T2 が EBCDIC であると想定されています。 この例では、カーソルを使用して T2 のすべてのデータを選択し、T1 にロードします。 このプロセスはクロスローダー機能 と呼ばれます。 データは、ロード時に Unicode に変換されます。
      //STEP5    EXEC DSNUPROC,UID='LOADIT',TIME=1440,COND=(EVEN),
      //         UTPROC='',
      //         SYSTEM='SSTR',DB2LEV=DB2A
      //SYSUT1   DD DSN=TEST123.STEP5.LOAD.SYSUT1,DISP=(MOD,DELETE,CATLG),
      //         UNIT=SYSDA,SPACE=(4000,(20,20),,,ROUND)
      //SORTOUT  DD DSN=TEST123.STEP5.LOAD.SORTOUT,DISP=(MOD,DELETE,CATLG),
      //         UNIT=SYSDA,SPACE=(4000,(20,20),,,ROUND)
      //SYSCOPY  DD DSN=TEST123.STEP5.LOAD.COPY,DISP=(MOD,DELETE,CATLG),
      //         UNIT=SYSDA,SPACE=(4000,(20,20),,,ROUND)
      //SYSIN    DD *
      EXEC SQL
        DECLARE C1 CURSOR FOR SELECT C1 FROM SYSADM.T2
      ENDEXEC
       
      LOAD DATA REPLACE INCURSOR C1 INTO TABLE SYSADM.T1
       
      //********************************************************************
      //STEP1    EXEC TSOBATCH,DB2LEV=DB2A
      //SYSTSIN  DD *
      DSN SYSTEM(SSTR)
      RUN PROGRAM DSNTEP2 PLAN(DSNTEPD1)
      //SYSIN    DD *
      SELECT * FROM SYSADM.T1;
      SELECT * FROM SYSADM.T2;
      /*
  3. 長さの差に対応するようアプリケーションで SQL を変更します。 CHARACTER_LENGTHやSUBSTRINGなどの長さ関数を使用する場合は、 CODEUNITS16 および CODEUNITS32 オプションを使用して、 Db2 の長さの計算方法を指定します