Referência de comandos qsam

O Mainframe Connector transcodifica ficheiros simples do método de acesso sequencial em fila (QSAM) para Google Cloud formatos compatíveis e vice-versa através dos comandos qsam. Os comandos qsam executam as seguintes operações de transcodificação:

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

Estas operações realizam transformações simétricas, ou seja, movem os mesmos dados para e a partir de Google Cloud. Pode definir a estrutura de um ficheiro QSAM num ficheiro copybook através da definição da estrutura de dados COBOL. Também pode definir transformações avançadas através do ficheiro de configuração do transcodificador do conector de mainframe. Os seguintes diagramas descrevem estas operações em detalhe.

Descodifique os dados do mainframe para Google Cloud
Descodifique dados do mainframe para Google Cloud
Codifique dados de mainframe de Google Cloud
Codifique Google Cloud dados para o mainframe

Esta página oferece uma vista geral do processo de transcodificação através dos comandos qsam decode e qsam encode, dos tipos físicos e lógicos de dados de mainframe, e das associações de tipos do Optimized Row Columnar (ORC) e do BigQuery.

Tipos físicos

Os tipos físicos definem a forma como os dados dos campos são organizados num disco. Os tipos físicos são convertidos em tipos lógicos do conetor de mainframe, que podem ser mapeados para tipos de base 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 carateres e são armazenados como strings com uma codificação específica, por exemplo, o Código de Intercâmbio Decimal Codificado em Binário Extendido (EBCDIC). O processo de transcodificação não termina se ocorrerem erros durante a codificação ou a descodificação de campos alfanuméricos. Em alternativa, é colocado um caráter SUB para a codificação na localização onde ocorreu o erro, e o processo de transcodificação continua.

Símbolos de imagens Atributos da 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 são predefinidos para a codificação EBCDIC
  • Os campos nacionais (N) são predefinidos para a codificação Unicode Transformation Format de 16 bits (UTF-16 BE)
  • Os campos UTF8 usam por predefinição a codificação Unicode Transformation Format-8 (UTF-8)

O conetor de mainframe suporta a maioria das codificações de conjunto de carateres de byte único (SBCS) e de conjunto de carateres de byte duplo (DBCS). Também pode definir a 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 com ou sem sinal. O Mainframe Connector armazena sempre campos binários logicamente como inteiros de 64 bits com sinal. Por conseguinte, as entradas longas não assinadas têm de usar apenas os 63 bits inferiores. Caso contrário, o processo de transcodificação falha.

Símbolos de imagens Atributos da imagem Tipo lógico
S, 9 COMP, COMPUTATIONAL Longo (número inteiro de 64 bits com sinal)

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 suportados. O conetor de mainframe usa formatos de precisão simples e dupla para campos HFP.

Símbolos de imagens Atributos da imagem Tipo lógico
COMP-1 e COMP-2 Duplo (vírgula flutuante com sinal de 64 bits)

Exemplo

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

Campos decimais compactados (COMP-3)

Os campos decimais compactados são totalmente suportados. 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 imagens Atributos da imagem Tipo lógico
S, 9, V COMP-3 Long (número inteiro de 64 bits com sinal), BigInteger, Decimal64, BigDecimal

Exemplo

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

Campo decimal zonado (DISPLAY)

Os campos decimais zonados são totalmente suportados. 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 imagens Atributos da imagem Tipo lógico
S, 9, V DISPLAY Long (número inteiro de 64 bits com sinal), 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 conetor de mainframe suporta 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 antecipadamente e este número permanece sempre o mesmo. Os itens numa lista fixa podem ter um tamanho variável.

As listas fixas são definidas da seguinte forma num copybook:

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

A imagem seguinte mostra o esquema de uma lista fixa com uma contagem de itens de 5.

Esquema de uma lista fixa
Esquema 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 antecipadamente. No entanto, a contagem de itens real é desconhecida e depende de outro campo. Os itens numa lista dinâmica podem ter um tamanho variável.

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

  • O campo de duração pode ser convertido num número inteiro sem perda de precisão.
  • O campo de comprimento tem de estar no âmbito.
  • O número mínimo de itens não é aplicado durante o processo de transcodificação.

As listas dinâmicas são definidas da seguinte forma num livro de registo:

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 seguinte mostra o esquema de uma lista dinâmica com um número máximo de itens de cinco.

Esquema de uma lista dinâmica
Esquema de uma lista dinâmica

Listas dinâmicas agrupadas

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 estão compactados.

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

  • O campo de duração pode ser convertido num número inteiro sem perda de precisão.
  • O campo de comprimento tem de estar no âmbito.
  • O número mínimo de itens não é aplicado durante o processo de transcodificação.

As listas dinâmicas compactadas são definidas da seguinte forma num livro de registo:

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 seguinte mostra o esquema de uma lista dinâmica compactada.

Esquema de uma lista dinâmica compactada
Esquema de uma lista dinâmica compactada

Redefinições (REDEFINES)

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

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

  • As redefinições dos mesmos dados subjacentes não são campos irmãos e, por isso, não estão no âmbito uns dos outros.
  • Os campos redefinidos são descodificados quando o campo subjacente é descodificado e não quando são declarados. O campo subjacente também determina o âmbito dos campos redefinidos.
  • Todos os campos redefinidos têm de ter o mesmo tamanho e um tamanho fixo. Isto significa que não pode 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 num livro de cópias:

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 seguinte mostra o esquema de um campo redefinido.

Esquema de um campo redefinido
Esquema de um campo redefinido

Pode usar as redefinições de várias formas, incluindo as seguintes formas mais comuns:

  • Ver os mesmos dados de duas formas diferentes: esta é a forma mais comum de usar as redefinições. Durante o processo de codificação, a ordem em que os dados são preenchidos não está definida, pelo que tem de garantir que os dados no BigQuery mantêm a respetiva integridade quando são 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 etiquetada: as uniões etiquetadas são uma forma comum de usar redefinições quando precisa apenas de uma das interpretações dos dados de qualquer registo, consoante um campo. Pode usar indicadores nulos para marcar interpretações desnecessárias como nulas. Isto também impede a respetiva análise devido a indicadores nulos com avaliações preguiçosas. As propriedades das uniões etiquetadas são as seguintes:

    • O processo de codificação falha se for definido mais do que um redefine.
    • Apenas são implementadas verificações de igualdade e não igualdade.

    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).
    

    Pode usar o exemplo seguinte para implementar uma união etiquetada:

    {
      "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 para e a partir de vários formatos, o Mainframe Connector converte todos os dados numa representação intermédia (IR) baseada em tipos lógicos. Os formatos de entrada e saída definem como os dados são convertidos para e a partir de qualquer tipo lógico. A tabela seguinte apresenta todos os tipos lógicos suportados pelo 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 num inteiro assinado de 64 bits de qualquer escala.
Duplo Representa um número de vírgula flutuante de precisão dupla, conforme descrito na norma IEEE para aritmética de vírgula 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.
Longo Representa um número de 64 bits com sinal.
Grave Representa uma série fixa de campos de tipos variáveis.
String Representa uma string de carateres Unicode não relacionada com nenhuma codificação específica. Qualquer ponto de código Unicode válido é representável. No entanto, alguns carateres podem não ser codificáveis em todos os processos de codificação. As strings lógicas têm um comprimento variável.
Indicação de tempo Representa uma data/hora independente de um fuso horário específico.

Mapeamento do tipo de ORC

A tabela seguinte 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 lista
Longo Número inteiro de 64 bits (bigint)
Grave struct
String String com codificação UTF-8
Indicação de tempo Data/hora (sem fuso horário local)

Mapeamento de tipos do BigQuery

A tabela seguinte fornece 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 DATA
Decimal64 NUMERIC
Duplo FLOAT64
Lista ARRAY Não são suportadas listas aninhadas nem listas de mapas.
Longo INT64
Grave STRUCT Quando uma união tem apenas uma variante, é convertida num campo NULLABLE. Caso contrário, uma união é convertida num RECORD com uma lista de campos NULLABLE. Os campos NULLABLE têm sufixos como field_0, field_1. Apenas um destes campos tem um valor atribuído quando os dados são lidos.
String STRING
Indicação de tempo DATA/HORA

Âmbito do campo

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

  • Um campo irmão definido antes do campo que o requer.
  • Um campo num registo principal que é definido antes do campo que o requer.