Referência de comandos qsam

O Mainframe Connector transcodifica arquivos planos do método de acesso sequencial em fila (QSAM, na sigla em inglês) para formatos compatíveis com Google Cloud e vice-versa usando os comandos qsam. Os comandos qsam executam as seguintes operações de transcodificação:

  • O comando qsam decode decodifica os dados do mainframe para Google Cloud.
  • O comando qsam encode codifica Google Cloud dados para o mainframe.

Essas operações executam transformações simétricas, ou seja, movem os mesmos dados para e de Google Cloud. É possível definir a estrutura de um arquivo QSAM em um arquivo de modelo usando a definição de estrutura de dados COBOL. Também é possível definir transformações avançadas usando o arquivo de configuração do transcodificador do Mainframe Connector. Os diagramas a seguir descrevem essas operações em detalhes.

Decodificar dados de mainframe para Google Cloud
Decodificar dados do mainframe para Google Cloud
Codificar dados de mainframe do Google Cloud
Codificar Google Cloud dados no mainframe

Esta página oferece uma visão geral do processo de transcodificação usando os comandos qsam decode e qsam encode, os tipos físico e lógico de dados de mainframe e os mapeamentos de tipo ORC (Optimized Row Columnar) e BigQuery.

Tipos físicos

Os tipos físicos definem como os dados de campo são dispostos em um disco. Os tipos físicos são convertidos em tipos lógicos do Mainframe Connector, que podem ser mapeados para tipos de banco de dados (ORC ou BigQuery).

Campos alfanuméricos

Os campos alfanuméricos são usados para processar strings alfanuméricas. Os dados são tratados como uma série de caracteres e armazenados como strings com uma codificação específica, por exemplo, o código de troca decimal codificado em binário estendido (EBCDIC). O processo de transcodificação não é encerrado se ocorrerem erros durante a codificação ou decodificação de campos alfanuméricos. Em vez disso, um caractere SUB para a codificação é colocado no local em que o erro ocorreu, e o processo de transcodificação continua.

Símbolos de imagem Atributos de imagem Tipo lógico
A, B, G, N, U, X, 9 DISPLAY, DISPLAY-1, NATIONAL, UTF-8 String

Exemplo

01 REC
  02 STR      PIC X(10)
  02 NATIONAL PIC N(10)
  02 UTF8     PIC U(1) USAGE UTF-8

Formato de codificação

Os campos alfanuméricos são codificados da seguinte maneira:

  • Os campos X têm a codificação EBCDIC como padrão
  • Os campos nacionais (N) têm como padrão a codificação Unicode Transformation Format 16 bits (UTF-16 BE)
  • Os campos UTF8 têm como padrão a codificação Unicode Transformation Format-8 (UTF-8)

O Mainframe Connector oferece suporte à maioria das codificações de conjunto de caracteres de byte único (SBCS) e de byte duplo (DBCS). Também é possível definir sua própria codificação SBCS personalizada, se necessário.

Campos binários (COMPUTATIONAL)

Os campos binários são armazenados como números inteiros big-endian assinados ou não assinados. O Mainframe Connector sempre armazena campos binários de forma lógica como números inteiros de 64 bits assinados. Portanto, as entradas longas não assinadas precisam usar apenas os 63 bits mais baixos. Caso contrário, o processo de transcodificação falha.

Símbolos de imagem Atributos de imagem Tipo lógico
S, 9 COMP, COMPUTATIONAL Long (número inteiro de 64 bits assinado)

Exemplo

01 REC
  02 INT PIC S9(8) COMP

Campos de ponto flutuante hexadecimal (COMP-1, COMP-2)

Há suporte total para campos de ponto flutuante hexadecimal (HFP, na sigla em inglês). O Mainframe Connector usa formatos de precisão simples e dupla para campos HFP.

Símbolos de imagem Atributos de imagem Tipo lógico
COMP-1, COMP-2 Duplo (ponto flutuante de 64 bits)

Exemplo

01 REC
  03 HFP-SINGLE COMP-1.
  03 HFP-DOUBLE COMP-2.

Campos decimais compactados (COMP-3)

Há suporte total para campos decimais compactados. Durante o processo de transcodificação, o Mainframe Connector seleciona o tipo lógico com melhor desempenho com base na precisão e na escala especificadas.

Símbolos de imagem Atributos de imagem Tipo lógico
S, 9, V COMP-3 Long (número inteiro de 64 bits assinado), BigInteger, Decimal64, BigDecimal

Exemplo

01 REC
  02 DEC PIC S9(2)V9(8) COMP-3

Campo decimal com zona (DISPLAY)

Os campos decimais com zona são totalmente compatíveis. Durante o processo de transcodificação, o Mainframe Connector seleciona o tipo lógico com melhor desempenho com base na precisão e na escala especificadas.

Símbolos de imagem Atributos de imagem Tipo lógico
S, 9, V DISPLAY Long (número inteiro de 64 bits assinado), BigInteger, Decimal64, BigDecimal

Exemplo

01 REC
  02 DEC PIC S9(2)V9(8) DISPLAY

Listas (OCCURS)

As listas são coleções ordenadas de elementos do mesmo tipo. O Mainframe Connector é compatível com os seguintes tipos de listas:

Listas fixas

As listas fixas são usadas quando o número exato de itens (contagem de itens) que farão parte da lista é conhecido com antecedência, e esse número permanece o mesmo. Os itens em uma lista fixa podem ter tamanho variável.

As listas fixas são definidas da seguinte maneira em um modelo:

       01 REC.
         02 LIST OCCURS 5 TIMES       PIC X(1).
         02 FLD                       PIC X(5).

A imagem a seguir mostra o layout de uma lista fixa com uma contagem de itens de 5.

Layout de uma lista fixa
Layout de uma lista fixa

Listas dinâmicas

As listas dinâmicas são usadas quando o número máximo de itens que vão fazer parte da lista é conhecido com antecedência. No entanto, a contagem real de itens é desconhecida e depende de outro campo. Os itens em uma lista dinâmica podem ter tamanho variável.

As propriedades das listas dinâmicas são as seguintes:

  • O campo de comprimento pode ser convertido em um número inteiro sem perda de precisão.
  • O campo "length" precisa estar no escopo.
  • A contagem mínima de itens não é aplicada durante o processo de transcodificação.

As listas dinâmicas são definidas da seguinte maneira em um modelo:

01 REC.
  02 LEN                      PIC S9(2) BINARY.
  02 LIST OCCURS 1 TO 5 TIMES
    DEPENDING ON LEN          PIC X(1).
  02 FLD                      PIC X(5).

A imagem a seguir mostra o layout de uma lista dinâmica com um número máximo de cinco itens.

Layout de uma lista dinâmica
Layout de uma lista dinâmica

Listas dinâmicas compactadas

As listas dinâmicas compactadas são usadas quando o número máximo de itens que vão fazer parte da lista depende de outro campo e os itens são compactados.

As propriedades das listas dinâmicas compactadas são as seguintes:

  • O campo de comprimento pode ser convertido em um número inteiro sem perda de precisão.
  • O campo "length" precisa estar no escopo.
  • A contagem mínima de itens não é aplicada durante o processo de transcodificação.

As listas dinâmicas compactadas são definidas da seguinte maneira em um modelo:

01 REC.
  02 LEN                       PIC S9(2) BINARY.
  02 LIST OCCURS UNBOUNDED
      DEPENDING ON LEN         PIC X(1).
  02 FLD                       PIC X(5).

A imagem a seguir mostra o layout de uma lista dinâmica compactada.

Layout de uma lista dinâmica compactada
Layout de uma lista dinâmica compactada

Redefinições (REDEFINES)

Redefinições é um recurso do COBOL que permite que os mesmos dados tenham várias possibilidades de decodificação. Durante o processo de decodificação, as redefinições aparecem como colunas adicionais na tabela resultante, e os dados são decodificados várias vezes.

As propriedades de redefinições são as seguintes:

  • As redefinições para os mesmos dados subjacentes não são campos irmãos e, portanto, não estão no escopo uma da outra.
  • Os campos redefinidos são decodificados quando o campo subjacente é decodificado, não quando são declarados. O campo principal também determina o escopo dos campos redefinidos.
  • Todos os campos redefinidos precisam ter o mesmo tamanho e ser fixos. Isso significa que não é possível usar campos de texto de comprimento variável e listas dinâmicas compactadas em campos redefinidos.

As redefinições são definidas da seguinte maneira em um modelo:

01  Rec.
05  Field-1   PIC X(100).
05  Group-1 REDEFINES Field-1.
  10  Field-2 PIC 9(4) comp-3.
  10  Field-3 PIC X(96).
05  Group-2 REDEFINES Field-1.
  10  Field-4 PIC 9(4) comp-5.
  10  Field-5 PIC X(50).
  10  Field-6 PIC X(46).

A imagem a seguir mostra o layout de um campo redefinido.

Layout de um campo redefinido
Layout de um campo redefinido

É possível usar as redefinições de várias maneiras, incluindo as mais comuns:

  • Visualizar os mesmos dados de duas maneiras diferentes:essa é a maneira mais comum de usar as redefinições. Durante o processo de codificação, a ordem em que os dados são preenchidos é indefinida. Portanto, é necessário garantir que os dados no BigQuery mantenham a integridade ao serem exportados.

    Exemplo

    01 REC.
      02 FULL-NAME                  PIC X(12).
      02 NAME REDEFINES FULL-NAME.
        05 FIRST-NAME               PIC X(6).
        05 LAST-NAME                PIC X(6).
    
  • Usar união marcada:as uniões marcadas são uma maneira comum de usar redefinições quando você precisa de apenas uma das interpretações dos dados de qualquer registro, dependendo de um campo. É possível usar indicadores nulos para marcar interpretações desnecessárias como nulas. Isso também vai impedir que eles sejam analisados devido a indicadores nulos que têm avaliações preguiçosas. As propriedades de uniões marcadas são as seguintes:

    • O processo de codificação falha se mais de uma redefinição for definida.
    • Somente as verificações de igualdade e não igualdade são implementadas.

    Exemplo

    01  REC.
    05  TYPE      PIC X(5).
    05  DATA      PIC X(100).
    05  VARIANT-1 REDEFINES DATA.
      10  Field-2 PIC 9(4) comp-3.
      10  Field-3 PIC X(96).
    05  VARIANT-2 REDEFINES DATA.
      10  Field-4 PIC 9(4) comp-5.
      10  Field-5 PIC X(50).
      10  Field-6 PIC X(46).
    

    Use o exemplo a seguir para implementar uma união com tags:

    {
      "field_override": [
        {
            "field": "VARIANT-1",
            "modifier": {
              "null_if": {
                "target_field": "TYPE",
                "non_null_value": "VAR1"
              }
            }
        },
        {
            "field": "VARIANT-2",
            "modifier": {
              "null_if": {
                "target_field": "TYPE",
                "non_null_value": "VAR2"
              }
            }
        }
      ],
      "transformations": [
        {
          "field": "DATA",
          "transformation": { "exclude": {}}
        }
      ]
    }
    

Tipos lógicos

Para transcodificar dados de e para vários formatos, o conector de mainframe converte todos os dados em uma representação intermediária (IR) baseada em tipos lógicos. Os formatos de entrada e saída definem como os dados são convertidos de e para qualquer tipo lógico. A tabela a seguir lista todos os tipos lógicos aceitos pelo Mainframe Connector.

Tipo lógico Descrição
Longo Representa um número assinado de 64 bits.
String Representa uma string de caracteres Unicode não relacionada a nenhuma codificação específica. Qualquer ponto de código Unicode válido pode ser representado. No entanto, alguns caracteres podem não ser codificados em todos os processos de codificação. As strings lógicas têm comprimento variável.
Decimal64 Representa um decimal com um intervalo que pode caber em um número inteiro assinado de 64 bits de qualquer escala.
BigInteger Representa números inteiros de qualquer tamanho.
BigDecimal Representa números decimais de qualquer escala e precisão.
Bytes Representa uma matriz de bytes de tamanhos variáveis.
Data Representa uma data independente de um fuso horário específico.
Duplo Representa um número de ponto flutuante de dupla precisão, conforme descrito no padrão IEEE para aritmética de ponto flutuante (IEEE 754).
Lista Representa uma lista de itens de um tipo específico. A lista pode conter um número arbitrário de itens.
Gravar Representa uma série fixa de campos de tipos variados.
Carimbo de data/hora Representa um carimbo de data/hora independente de um fuso horário específico.

Mapeamento de tipo ORC

A tabela a seguir fornece o mapeamento entre os tipos lógicos do Conector de mainframe e os tipos ORC.

Tipo lógico Tipo ORC
Longo Inteiro de 64 bits (bigint)
String String codificada em UTF-8
Decimal64 decimal64
BigInteger decimal
BigDecimal decimal
Bytes blob binário
Data data
Duplo float64
Lista list
Gravar struct
Carimbo de data/hora carimbo de data/hora (sem fuso horário local)

Mapeamento de tipo do BigQuery

A tabela a seguir mostra o mapeamento entre os tipos lógicos do Conector de mainframe e os tipos de dados do BigQuery.

Tipo lógico Tipo de dados do BigQuery Comentários
Longo INT64
String STRING
Decimal64 NUMERIC
BigInteger NUMERIC
BigDecimal NUMERIC
Bytes BYTES
Data DATE
Duplo FLOAT64
Lista ARRAY Listas aninhadas e listas de mapas não são aceitas.
Gravar STRUCT Quando um tipo union tem apenas uma variante, ele é convertido em um campo NULLABLE. Caso contrário, um tipo union é convertido em RECORD com uma lista de campos NULLABLE. Os campos NULLABLE têm sufixos, como field_0 e field_1. Apenas um desses campos recebe um valor durante a leitura dos dados.
Carimbo de data/hora TIMESTAMP

Escopo do campo

Um campo é considerado no escopo de outro campo se for um dos seguintes:

  • Um campo irmão que é definido antes do campo que o exige.
  • Um campo em um registro pai que é definido antes do campo que o exige.