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.


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.

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.

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.

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.

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