Referência de comandos qsam

O Mainframe Connector transcodifica arquivos simples do Queued Sequential Access Method (QSAM) para formatos compatíveis com Google Cloud e vice-versa usando os comandos qsam. Os comandos qsam realizam as seguintes operações de transcodificação:

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

Essas operações realizam 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 livro de cópias 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 do mainframe para Google Cloud
Decodificar dados do mainframe para Google Cloud
Codificar dados do mainframe de Google Cloud
Codificar dados Google Cloud para o mainframe

Nesta página, você encontra uma visão geral do processo de transcodificação usando os comandos qsam decode e qsam encode, os tipos físicos e lógicos de dados de mainframe e os mapeamentos de tipo ORC (Optimized Row Columnar) e do BigQuery.

Tipos físicos

Os tipos físicos definem como os dados de campo são organizados em um disco. Os tipos físicos são convertidos em tipos lógicos do conector de mainframe, 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, 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 imagens 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 forma:

  • X campos usam a codificação EBCDIC por padrão
  • Os campos nacionais (N) usam por padrão a codificação Unicode Transformation Format 16-bit (UTF-16 BE).
  • Os campos UTF8 usam por padrão a codificação Unicode Transformation Format-8 (UTF-8)

O Mainframe Connector é compatível com a 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 logicamente como inteiros de 64 bits assinados. Portanto, entradas longas sem sinal precisam usar apenas os 63 bits inferiores. Caso contrário, o processo de transcodificação falhará.

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

Exemplo

01 REC
  02 INT PIC S9(8) COMP

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

Os campos de ponto flutuante hexadecimal (HFP) são totalmente compatíveis. O Mainframe Connector usa formatos de precisão simples e dupla para campos HFP.

Símbolos de imagens Atributos de imagem Tipo lógico
COMP-1, COMP-2 Double (ponto flutuante assinado 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 de melhor desempenho com base na precisão e na escala especificadas.

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

Exemplo

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

Campo decimal zonado (DISPLAY)

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

Símbolos de imagens Atributos de imagem Tipo lógico
S, 9, V DISPLAY Long (inteiro assinado de 64 bits), 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 sempre permanece o mesmo. Os itens em uma lista fixa podem ter tamanhos variados.

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

       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 farão 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 tamanhos variados.

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

  • O campo "length" pode ser convertido em um número inteiro sem perda de precisão.
  • O campo de duração 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 copybook:

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 itens de cinco.

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 farão 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 "length" pode ser convertido em um número inteiro sem perda de precisão.
  • O campo de duração 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 copybook:

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 das redefinições são as seguintes:

  • Redefinições para os mesmos dados subjacentes não são campos irmãos e, portanto, não estão no escopo um do outro.
  • Os campos redefinidos são decodificados quando o campo subjacente é decodificado, não quando são declarados. O campo subjacente também determina o escopo dos campos redefinidos.
  • Todos os campos redefinidos precisam ter o mesmo tamanho e um tamanho fixo. 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 forma em um copybook:

01  Rec.
05  Field-1   PIC X(100).
05  Group-1 REDEFINES Field-1.
  10  Field-2 PIC 9(5) comp-3.
  10  Field-3 PIC X(96).
05  Group-2 REDEFINES Field-1.
  10  Field-4 PIC 9(4) comp-4.
  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 redefinições de várias maneiras, incluindo as seguintes, que são as mais comuns:

  • Ver os mesmos dados de duas maneiras diferentes:essa é a forma mais comum de usar as redefinições. Durante o processo de codificação, a ordem em que os dados são preenchidos é indefinida. Portanto, garanta que os dados no BigQuery mantenham a integridade quando forem 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).
    
  • Use união com tag:as uniões com tag são uma maneira comum de usar redefinições quando você precisa apenas de 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 impede que eles sejam analisados devido a indicadores nulos com avaliações lentas. As propriedades das uniões marcadas são as seguintes:

    • O processo de codificação falha se mais de uma redefinição for definida.
    • Apenas verificações de igualdade e desigualdade 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).
    

    Você pode usar o exemplo a seguir para implementar uma união com tag:

    {
      "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 para e de qualquer tipo lógico. A tabela a seguir lista todos os tipos lógicos compatíveis com o Mainframe Connector.

Tipo lógico Descrição
BigDecimal Representa números decimais de qualquer escala e precisão.
BigInteger Representa números inteiros de qualquer tamanho.
Bytes Representa uma matriz de bytes de tamanhos variáveis.
Data Representa uma data independente de um fuso horário específico.
Decimal64 Representa um decimal com um intervalo que pode caber em um número inteiro assinado de 64 bits de qualquer escala.
Duplo Representa um número de ponto flutuante de dupla precisão, conforme descrito no IEEE Standard for Floating-Point Arithmetic (IEEE 754).
Lista Representa uma lista de itens de um tipo específico. A lista pode conter um número arbitrário de itens.
Longo Representa um número assinado de 64 bits.
Gravar Representa uma série fixa de campos de tipos variados.
String Representa uma string de caracteres Unicode não relacionados a uma codificação específica. Qualquer ponto de código Unicode válido pode ser representado. No entanto, alguns caracteres podem não ser codificáveis em todos os processos de codificação. As strings lógicas têm comprimento variável.
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 Mainframe Connector e os tipos ORC.

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

Mapeamento de tipos do BigQuery

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

Tipo lógico Tipo de dados do BigQuery Comentários
BigDecimal NUMERIC
BigInteger NUMERIC
Bytes BYTES
Data DATE
Decimal64 NUMERIC
Duplo FLOAT64
Lista ARRAY Listas aninhadas e listas de mapas não são aceitas.
Longo INT64
Gravar STRUCT Quando uma união tem apenas uma variante, ela é convertida 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.
String STRING
Carimbo de data/hora TIMESTAMP

Escopo do campo

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

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