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.


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.

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.

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.

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.

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