COBOL - NULL no DB2 e COBOL - www.cadcobol.com.br



Desenvolvido por DORNELLES Carlos Alberto - Analista de Sistemas - Brasília DF. - cad_cobol@hotmail.com

COBOL - NULL no DB2 e COBOL

SQL, ao contrário de COBOL, suporta variáveis que podem conter nulos (valores - o uso da palavra "valor" junto com NULL geralmente não é encorajado, pois NULL em si significa ausência de valor e por si só não pode ser denominado como "valor", também )
Na verdade, um "valor" nulo significa que nenhuma entrada foi feita e geralmente implica que o valor é desconhecido ou indefinido no momento.
Por exemplo, um valor nulo em uma coluna de data de junção não significa que a data é indeterminada, significa que a data não é conhecida ou ainda não foi definida.

SQL, unlike COBOL, supports variables that can contain null (values - the use of word "value" along with NULL is not usually encouraged as NULL itself means the absence of value and it in itself can not be termed as "value", well).
Actually, a null "value" means that no entry has been made and usually implies that the value is either unknown or undefined, at the moment.
For example, a null value in a joining date column does not mean that the date is undetermined, it means that the date is not known or has not been set yet.

Para uma coluna em uma tabela do DB2 para a qual nulo é permitido, um tratamento especial é necessário em um programa COBOL.
O programa deve definir uma variável indicadora nula para cada coluna para a qual são permitidos nulos.
Esta variável indicadora nula deve ser definida como uma meia-palavra binária - PIC S9 (4) COMP (por quê? - bem, no momento trate-a como uma regra) - e deve ser listada no FETCH como uma variável de host adicional imediatamente após a regular variável de host.
Se o valor desta variável indicadora for menor que zero, o atributo na tabela era nulo.

For a column in a DB2 table for which null is allowed, special handling is required in a COBOL program.
The program should define a null indicator variable for each column for which nulls are allowed.
This null indicator variable should be defined as a binary halfword - PIC S9(4) COMP (why? - well, at the moment treat it as a rule) - and should be listed in the FETCH as an additional host variable immediately after the regular host variable.
If the value of this indicator variable is less than zero then the attribute within the table was null.

Para responder à sua pergunta - vamos começar com uma tabela CREATE chamada MYTABLE que contém três campos: COL_A (que não é NULL), COL_B (nulos permitidos) e COL_C (nulos permitidos).
Em seguida, usamos instruções INSERT para preencher a tabela:

To answer your question - let's begin with a CREATE table called MYTABLE which contains three fields: COL_A (which is NOT NULL), COL_B (nulls allowed) and COL_C (nulls allowed).
We then use INSERT statements to populate the table:

CREATE TABLE MYTABLE
     ( COL_A CHAR(2) NOT NULL,
       COL_B CHAR(2) ,
       COL_C CHAR(2) ) ;
INSERT INTO MYTABLE 
     VALUES ('A', 'B', 'C');

INSERT INTO MYTABLE 
    VALUES ('D', 'E', NULL);

INSERT INTO MYTABLE 
     VALUES ('F', NULL, G');

INSERT INTO MYTABLE 
     VALUES ('H', NULL, NULL);

INSERT INTO MYTABLE 
     VALUES ('I', 'J', 'K');

Agora abaixo, as variáveis do indicador são codificadas dentro da WORKING-STORAGE SECTION da seguinte forma (nenhuma variável é codificada para COL_A, pois foi definida como NOT NULL):

Now below, the indicator variables are coded within the WORKING-STORAGE SECTION as follows (no such variable is coded for COL_A as it was defined as NOT NULL):

05  COL_B-NULL-INDICATOR   PIC S9(4) COMP.
05  COL_C-NULL-INDICATOR   PIC S9(4) COMP.

Você pode ver que a variável do indicador nulo está listada no FETCH como uma variável do host adicional imediatamente após a variável do host regular da seguinte maneira:

You can see that the null indicator variable is listed in the FETCH as an additional host variable immediately after the regular host variable as follows:

EXEC SQL
     FETCH MYTABLE-CURSOR INTO
           :MY-COL_A ,
           :MY-COL_B :COL_B-NULL-INDICATOR,
           :MY-COL_C :COL_C-NULL-INDICATOR
END-EXEC.

Se o valor recuperado da tabela for nulo, a variável do indicador nulo conterá um valor menor que zero, então verificamos o indicador nulo da seguinte maneira:

If the value retrieved from the table is null, the null indicator variable will contain a value less than zero, so we check the null indicator as follows:

IF COL_B-NULL-INDICATOR < 0
   MOVE ALL '*' TO DL-COL_B
ELSE
   MOVE MY-COL_B TO DL-COL_B
END-IF