Conversión de datos de Db2 existentes a Unicode

Si la base de datos y las aplicaciones manejan datos internacionales, se recomienda convertir los datos de Db2 a Unicode. La utilización de Unicode puede impedir las conversiones de caracteres y, por lo tanto, mejorar en rendimiento y ayudar a garantizar la integridad de los datos. Sin embargo, los datos en Unicode pueden exigir más espacio. En función de los datos, estos caracteres también pueden un tamaño de dos a tres veces superior al de los caracteres EBCDIC o ASCII.

Antes de empezar

Antes de convertir los datos de Db2 existentes a Unicode, tenga en cuenta lo siguiente:
  • Considere los efectos en todas las aplicaciones y herramientas asociadas. Por ejemplo, considere los efectos en cualquier aplicación de pantalla verde.
  • Debe saber cuál era la procedencia original de los datos. Si los datos ya se han convertido desde su formato original, pueden contener caracteres de sustitución. Si es así, considere la posibilidad de volver a convertir los datos a su formato original y, a continuación, convertirlos a Unicode.

    Por ejemplo, suponga que convierte los datos de EBCDIC a Unicode y los datos tenían originalmente formato ASCII. Es posible que tenga que convertir los datos a su formato ASCII original y, a continuación, a Unicode. Realice esta conversión adicional si los datos ASCII originales han experimentado una conversión de ida y vuelta a EBCDIC y no todos los caracteres existen en EBCDIC. Por ejemplo, suponga que ha convertido los datos del CCSID ASCII 1252 al CCSID EBCDIC 37. El CCSID 1252 contiene caracteres que no existen en el CCSID 37. Por lo tanto, los datos de EBCDIC tienen caracteres de control en lugar de los caracteres que existían en ASCII, pero no en EBCDIC. (Considere el ejemplo del símbolo de marca registrada ™ en Conversión de ida y vuelta ) La conversión de los datos a ASCII recupera, en primer lugar, los valores originales antes de convertirlos a Unicode.

Procedimiento

Para convertir datos existentes de Db2 a Unicode:

  1. Cree una o más tablas Unicode para estos datos.
  2. Utilice una de las técnicas siguientes para cargar los datos existentes en las tablas de Unicode nuevas. Db2 convierte los datos a Unicode cuando los carga.
    • Utilice la sentencia INSERT con una subselección.
      INSERT INTO UNICODETABLE
           SELECT *
           FROM EBCDICTABLE;
      Para este ejemplo, asegúrese de que las columnas para UNICODETABLE y EBCDICTABLE sean compatible. Por ejemplo, si la primera columna de EBCDICTABLE es una columna de carácter, la primera columna de UNICODETABLE también debe ser una columna de carácter; si la segunda columna de EBCDICTABLE es una columna numérica, la segunda columna de UNICODETABLE también debe ser una columna numérica.
    • Utilice el programa de utilidad UNLOAD para descargar los datos tal cual en un conjunto de datos EBCDIC o ASCII. A continuación, utilice LOAD para cargar los datos en la nueva tabla Unicode. Especifique la palabra clave de esquema de codificación apropiada (ASCII, EBCDIC o CCSID) en la sentencia LOAD.
      Recomendación : Utilice la opción PUNCHDDN de la utilidad UNLOAD para generar las sentencias de la utilidad LOAD correspondientes a los datos a medida que se descargan en un Db2 .
      El JCL de ejemplo siguiente realiza las acciones siguientes:
      • En STEP1 se crean y se llenan dos tablas. T1 es una tabla Unicode. T2 es una tabla EBCDIC.
      • En STEP2 se descargan los datos de la tabla EBCDIC T2. La sentencia UNLOAD contiene la opción PUNCHDDN. Esta opción genera (en el conjunto de datos SYSPUNCH) sentencias LOAD correspondientes para cargar los datos nuevamente en la tabla original, T2. Para utilizar este archivo SYSPUNCH para cargar los datos descargados en la tabla T1, debe modificar el SYSPUNCH o el JCL.
      • En STEP3 se cargan los datos descargados en STEP2 en la tabla Unicode T1. Dado que el catálogo define la tabla como Unicode, los datos se convierten a Unicode cuando se cargan.
      • En STEP4 se proporcionan como salida los datos actuales a ambas tablas.
      //STEP1    EXEC  TSOBATCH
      //SYSTSIN  DD *
      DSN S(SSTR) R(1) T(1)
      RUN PROGRAM DSNTEP2 PLAN(DSNTEPC1)
      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(DSNTEPC1))
      //SYSIN    DD *
      SELECT * FROM SYSADM.T1;
      SELECT * FROM SYSADM.T2;
      /*
    • Utilice la función de carga cruzada para cargar la salida de una sentencia SELECT de SQL dinámico en la nueva tabla Unicode. La sentencia SELECT selecciona toda la tabla. En el ejemplo siguiente, supongamos que la tabla T1 es Unicode y que la tabla T2 es EBCDIC. Este ejemplo utiliza un cursor para seleccionar todos los datos de T2 para luego cargarlos en T1. Este proceso recibe el nombre de función de carga cruzada. Los datos se convierten a Unicode cuando se cargan.
      //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(DSNTEPC1)
      //SYSIN    DD *
      SELECT * FROM SYSADM.T1;
      SELECT * FROM SYSADM.T2;
      /*
  3. Modifique el SQL de las aplicaciones para que responda a las diferencias de longitud. Si utiliza funciones de longitud, como CHARACTER_LENGTH y SUBSTRING, utilice las opciones CODEUNITS16 y CODEUNITS32 para especificar cómo desea que Db2 calcule la longitud.