domingo, 26 de março de 2017

Variável host para coluna VARCHAR

Olá!

Um programa COBOL que persiste dados em uma tabela que contenha uma coluna do tipo varchar, deve estar preparado com uma variável host que seja um item de grupo que possua a quantidade de caracteres armazenada e o texto.

Tabela:
        CREATE TABLE INSCRICOES
           (
               CODIGO_PESSOA  INT         NOT NULL
           ,   NOME           CHAR(30)    NOT NULL
           ,   SOBRENOME      VARCHAR(50) WITH DEFAULT 'em branco'
           ,   DATA_INSCRICAO DATE        WITH DEFAULT GETDATE()
           ,   HORA_SAIDA     TIME
           ,   TS_CHEGADA     TIMESTAMP
           ,   VALOR          DOUBLE
           )

Então, para coluna SOBRENOME da tabela acima, a variável host pode ser implementada da seguinte forma:
           03  SOBRENOME-PESSOA.
               49 TAMANHO-SOBRENOME     PIC S9(004) USAGE BINARY.
               49 TEXTO-SOBRENOME       PIC  X(050).

Qual variável deve ser mencionada na instrução SQL? O nome do item de grupo ou a variável alpha Pic X?

  • Na instrução SQL deve ser mencionado o nome do item de grupo.

Suponha que se tenha um cursor para buscar todos os registros da tabela de INSCRICOES, assim o comando de leitura do cursor, é:

           EXEC SQL
               FETCH INSENSITIVE ABSOLUTE POSITION-READ CURSOR-NAME
                   INTO :CODIGO-PESSOA
                      , :NOME-PESSOA
                      , :SOBRENOME-PESSOA
                      , :DATA-INSCRICAO
                      , :HORA-SAIDA
                      , :TS-CHEGADA
                      , :VALOR-INSCRICAO
           END-EXEC

De modo que logo após a execução do Fetch o texto armazenado na tabela será movimentado para TEXTO-SOBRENOME, e a quantidade de caracteres será automaticamente contabilizada em TAMANHO-SOBRENOME.

Logo se o registro lido possuir o seguinte sobrenome: "Barbosa Ferreira". Os valores serão armazenados na variável host da seguinte forma:
TAMANHO-SOBRENOME = 16
TEXTO-SOBRENOME = Barbosa Ferreira

Para o processamento de leitura do banco de dados (DB) a variável que armazena o tamanho do texto possui o valor gerado automaticamente. Entretanto, para os processos de inserir ou atualizar dados no DB, deve ser calculado pelo COBOL a quantidade de caracteres que serão persistidas no registro em questão.


Para calcular a quantidade de caracteres de uma variável, veja o post: 


Onde, as variáveis do post citado terão respectivamente a seguinte movimentação:

           MOVE TAM-STRING              TO TAMANHO-SOBRENOME
           MOVE TEXTO                   TO TEXTO-SOBRENOME

Lembrando, que na instrução SQL é mencionado o nome do item de grupo da variável host.

Consultar a relação de Termos e Abreviaturas acesse aqui.
FELIPE BARBOSA FERREIRA

Até o próximo post!

domingo, 12 de março de 2017

Equivalência tamanho variável SQL / COBOL

Olá!

Ao declarar variáveis no COBOL para serem utilizadas em comandos SQLs (ou seja, variáveis hosts), temos que assegurar que elas são compatíveis com o mesmo tipo e tamanho de dado da coluna do banco de dados (DB).

Pois, o pré-compilador do COBOL realiza a verificação se os tipos de dados são equivalentes entre a variável declarada e a coluna da tabela do DB.

Na tabela abaixo há a representação de cada variável host COBOL equivalente para cada tipo de dado SQL:

Tipo de dado SQLVariável host COBOL
SMALLINT
S9(004) COMP-4
S9(004) COMP-5
S9(004) COMP
S9(004) BINARY

INTEGER
S9(009) COMP-4
S9(009) COMP-5
S9(009) COMP
S9(009) BINARY

DECIMAL(p,s)
NUMERIC(p,s)

S9(p-s)V9(s) COMP-3
S9(p-s)V9(s)

Se DECIMAL com s=0 (sem valores após a virgula), usar:
S9(p)V

Se NUMERIC com s=0 (sem valores após a virgula), usar:
S9(p)

Para armazenar somente os números após a vírgula, usar:
SV9(s)

Se o compilador não suportar 31 dígitos decimal, usar:
USAGE COMP-2

Sendo "p" a precisão de números, e "s" a escala

REAL
FLOAT(n)

COMP-1
Sendo "n": 1<= n <= 21

DOUBLE
FLOAT(n)

COMP-2
Sendo "n": 22 <= n <= 53

BIGINT
S9(018) COMP-4
S9(018) COMP-5
S9(018) COMP
S9(018) BINARY

CHAR(n)
Sendo "n" a quantidade de caracteres (tamanho fixo).
01 variavel-nome PIC X(n).

VARCHAR(n)
Sendo "n" a quantidade de caracteres (tamanho dinâmico).
01 variavel-nome.
     49 nome-tamanho PIC S9(004) USAGE BINARY.
     49 nome-variavel PIC X(n).

Onde, nome-tamanho é a variável que irá armazenar a
quantidade de caracteres presentes em nome-variavel.

DATE
PIC X(n)
Sendo "n" determinado pela regra de negocio,
caso contrario "n" deve ser no minimo 10

TIME
PIC X(n)
Sendo "n" determinado pela regra de negocio,
caso contrario "n" deve ser no minimo 6,
ou 8 para incluir os segundos

TIMESTAMP
PIC X(n)
Sendo "n" no mínimo 19, para incluir os microssegundos "n"
deve ser 26



Exemplo da declaração de variáveis hosts para a tabela INSCRICOES:

Definição da tabela:
        CREATE TABLE INSCRICOES
           (
               CODIGO_PESSOA  INT         NOT NULL
           ,   NOME           CHAR(30)    NOT NULL
           ,   SOBRENOME      VARCHAR(50) WITH DEFAULT 'em branco'
           ,   DATA_INSCRICAO DATE        WITH DEFAULT GETDATE()
           ,   HORA_SAIDA     TIME
           ,   TS_CHEGADA     TIMESTAMP
           ,   VALOR          DOUBLE
           )

Declaração COBOL para as variáveis hosts, conforme:
      * -- Variaveis hosts da tabela INSCRICOES
       01  TAB-INSCRICOES.
           03  CODIGO-PESSOA            PIC S9(009).
           03  NOME                     PIC  X(030).
           03  SOBRENOME.
               49 TAMANHO-SOBRENOME     PIC S9(004) USAGE BINARY.
               49 TEXTO-SOBRENOME       PIC  X(050).
           03  DATA_INSCRICAO           PIC  X(010).
           03  HORA_SAIDA               PIC  X(008).
           03  TS_CHEGADA               PIC  X(026).
           03  VALOR                    USAGE COMP-2.

O tipo de dado SQL não está na tabela acima, veja mais tipos de dados aqui.

Consultar a relação de Termos e Abreviaturas acesse aqui.
FELIPE BARBOSA FERREIRA


Até o próximo post!