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.


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.

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.

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.

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.

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.