FORMAT… ¿UNFORMAT?

FORMAT es una cláusula que Teradata utiliza para formatear resultados de ‘queries’. Es análoga a las conocidas funciones de Oracle (y desde la versión 14 también en Teradata) TO_CHAR(), TO_DATE(), TO_NUMBER()… pero la principal diferencia es que FORMAT se puede utilizar en sentencias ‘DDL’ (Data Definition Language). Esto es: la forma en que los datos se presentarán se guarda en la propia definición de la tabla en el diccionario de datos de Teradata.
Hay que tener en cuenta que FORMAT sólo hace eso: actuar sobre la presentación de los datos, pero no modifica en modo alguno el tipo de dato ni la forma en la que éste se almacena.

 BTEQ -- Enter your SQL request or BTEQ command:
CREATE TABLE CARLOS.PRUEBA01
   ( ID_N INTEGER NOT NULL,
     C_TXT VARCHAR(25) FORMAT 'X(10)'
   )
   UNIQUE PRIMARY INDEX (ID_N)
;

 *** Table has been created.
 *** Total elapsed time was 1 second.

 BTEQ -- Enter your SQL request or BTEQ command:
SHOW TABLE CARLOS.PRUEBA01;

 *** Text of DDL statement returned.
 *** Total elapsed time was 1 second.

--------------------------------------------------------------------------------
CREATE SET TABLE CARLOS.PRUEBA01 ,NO FALLBACK ,
     NO BEFORE JOURNAL,
     NO AFTER JOURNAL,
     CHECKSUM = DEFAULT,
     DEFAULT MERGEBLOCKRATIO
     (
      ID_N INTEGER NOT NULL,
      C_TXT VARCHAR(25) CHARACTER SET LATIN NOT CASESPECIFIC FORMAT 'X(10)')
UNIQUE PRIMARY INDEX ( ID_N );

 BTEQ -- Enter your SQL request or BTEQ command:
INSERT INTO CARLOS.PRUEBA01
VALUES(1, '1234567890123456789012345');

 *** Insert completed. One row added.
 *** Total elapsed time was 1 second.

 BTEQ -- Enter your SQL request or BTEQ command:
SELECT * FROM CARLOS.PRUEBA01;

 *** Query completed. One row found. 2 columns returned.
 *** Total elapsed time was 1 second.

       ID_N  C_TXT
-----------  ----------
          1  1234567890

En el caso anterior sólo se muestran los primeros 10 caracteres de las cadenas VARCHAR(25) (aunque las cadenas sí existirán completas en la tabla y se podrían mostrar con otra cláusula FORMAT en el SELECT que las consulte, que tendrá precedencia sobre el FORMAT de la definición de la tabla)

 BTEQ -- Enter your SQL request or BTEQ command:
SELECT ID_N, C_TXT (FORMAT 'X(25)') FROM CARLOS.PRUEBA01;

 *** Query completed. One row found. 2 columns returned.
 *** Total elapsed time was 1 second.

       ID_N  C_TXT
-----------  -------------------------
          1  1234567890123456789012345

Podemos cambiar el formato de la columna con un ALTER TABLE … ADD … FORMAT:

 BTEQ -- Enter your SQL request or BTEQ command:
ALTER TABLE CARLOS.PRUEBA01 ADD C_TXT FORMAT 'X(30)';

 *** Table has been modified.
 *** Total elapsed time was 1 second.

 BTEQ -- Enter your SQL request or BTEQ command:
SHOW TABLE CARLOS.PRUEBA01;

 *** Text of DDL statement returned.
 *** Total elapsed time was 1 second.

--------------------------------------------------------------------------------
CREATE SET TABLE CARLOS.PRUEBA01 ,NO FALLBACK ,
     NO BEFORE JOURNAL,
     NO AFTER JOURNAL,
     CHECKSUM = DEFAULT,
     DEFAULT MERGEBLOCKRATIO
     (
      ID_N INTEGER NOT NULL,
      C_TXT VARCHAR(25) CHARACTER SET LATIN NOT CASESPECIFIC FORMAT 'X(30)')
UNIQUE PRIMARY INDEX ( ID_N );

En ese caso, las cadenas VARCHAR(25) serán rellenadas por la derecha (‘padded’) hasta su formato de 30 caracteres.

Pero, ¿qué pasa si queremos eliminar el formato de una columna? No existe una cláusula “UNFORMAT”…

Lo primero es intentar un ALTER TABLE … ADD … sin FORMAT:

 BTEQ -- Enter your SQL request or BTEQ command:
ALTER TABLE CARLOS.PRUEBA01 ADD C_TXT VARCHAR(25);

 *** Table has been modified.
 *** Total elapsed time was 1 second.

 BTEQ -- Enter your SQL request or BTEQ command:
SHOW TABLE CARLOS.PRUEBA01;

 *** Text of DDL statement returned.
 *** Total elapsed time was 1 second.

--------------------------------------------------------------------------------
CREATE SET TABLE CARLOS.PRUEBA01 ,NO FALLBACK ,
     NO BEFORE JOURNAL,
     NO AFTER JOURNAL,
     CHECKSUM = DEFAULT,
     DEFAULT MERGEBLOCKRATIO
     (
      ID_N INTEGER NOT NULL,
      C_TXT VARCHAR(25) CHARACTER SET LATIN NOT CASESPECIFIC FORMAT 'X(30)')
UNIQUE PRIMARY INDEX ( ID_N );

Pero vemos que no funciona: no hemos conseguido nada.

Discurriendo (y antes de crear otra tabla sin el FORMAT y hacer un INSERT… SELECT para luego borrar la tabla original y renombrar la nueva) podíamos probar a modificar la columna a su formato ‘por defecto’:

 BTEQ -- Enter your SQL request or BTEQ command:
ALTER TABLE CARLOS.PRUEBA01 ADD C_TXT FORMAT 'X(25)';

 *** Table has been modified.
 *** Total elapsed time was 1 second.

 BTEQ -- Enter your SQL request or BTEQ command:
SHOW TABLE CARLOS.PRUEBA01;

 *** Text of DDL statement returned.
 *** Total elapsed time was 1 second.

--------------------------------------------------------------------------------
CREATE SET TABLE CARLOS.PRUEBA01 ,NO FALLBACK ,
     NO BEFORE JOURNAL,
     NO AFTER JOURNAL,
     CHECKSUM = DEFAULT,
     DEFAULT MERGEBLOCKRATIO
     (
      ID_N INTEGER NOT NULL,
      C_TXT VARCHAR(25) CHARACTER SET LATIN NOT CASESPECIFIC)
UNIQUE PRIMARY INDEX ( ID_N );

 BTEQ -- Enter your SQL request or BTEQ command:

Y sí: mágicamente, la cláusula FORMAT ha desaparecido del DDL de la tabla almacenado en el diccionario de datos.

Así pues, para eliminar una cláusula FORMAT no deseada en la definición de una tabla basta con redefinir la(s) columna(s) con su FORMAT ‘por defecto’.

Saludos.

Carlos.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: