Cargar campos “COBOL BINARY” con Multiload.

22 febrero \22\UTC 2017

Análogamente a los tipos COBOL ‘packed decimal’ que corresponden con tipos SQL DECIMAL(n, m), los tipos BINARY corresponden a tipos enteros SQL: SMALLINT (2 bytes), INTEGER (4 bytes) y BIGINT (8 bytes).

En multiload, definiendo los .FIELD adecuados en el .LAYOUT conseguiremos una carga sin errores:

...
.LAYOUT THE_LAYOUT;
...
.FIELD binary_field2  SMALLINT;
.FIELD binary_field4  INTEGER;
.FIELD binary_field8  BIGINT;
...

Pero ¿qué ocurre cuando el ‘PIC’ del campo BINARY indica que tiene decimales? Como en el caso de los ‘packed decimals‘ los decimales no se guardan en los campos BINARY, sino que se resuelven con los ‘PICTURES’ (PIC). Así pues, nos podemos encontrar, por ejemplo, un BINARY con un PIC S9(3)V9(6).
A diferencia de con los ‘packed decimals’ o los BINARY enteros, no podemos apoyarnos en la funcionalidad de multiload para la conversión directa, ya que no hay un tipo ‘SQL’ equivalente para BINARY con decimales.

Por eso lo debemos solucionar en dos pasos:

Primero definimos el .FIELD adecuado en el .LAYOUT. Si el campo es, por ejemplo, BINARY PIC S9(3)V9(6) entonces ocupará 4 bytes, y por tanto corresponderá a un tipo INTEGER. Así pues, en el ‘script‘ de multiload:

...
.LAYOUT THE_LAYOUT;
...
.FIELD binary_field4  INTEGER;
...

(Recordemos que según el tamaño del campo deberíamos haberlo definido como SMALLINT, INTEGER o BIGINT).

Una vez hecho esto deberemos insertarlo en la columna de la tabla correspondiente (que deberá ser DECIMAL(9, 6)). Es aquí donde haremos el CAST (implícito).

Más abajo en el mismo ‘script‘ de multiload, haciendo:

...
INSERT INTO MY_DB.MY_TABLE( ..., MY_COLUMN, ...) 
VALUES(..., :binary_field4/1000000.000000, ...);
...

conseguimos que el :binary_field4, que hemos cargado como INTEGER según el .LAYOUT se almacene en la columna como DECIMAL(9, 6) obedeciendo al ‘PIC’. Es muy importante definir el denominador con el número de decimales adecuado (en nuestro caso seis), porque si no se producirá un CAST erróneo que provocará truncamiento y nos dará un resultado incorrecto.

Saludos.

Carlos.

Anuncios