Mainframe Connector transcodifica i file flat QSAM (Queued Sequential Access Method) in formati Google Cloud compatibili e viceversa utilizzando i comandi qsam
. I comandi qsam
eseguono le seguenti operazioni di transcodifica:
- Il comando
qsam decode
decodifica i dati del mainframe in Google Cloud - Il comando
qsam encode
codifica Google Cloud i dati per il mainframe.
Queste operazioni eseguono trasformazioni simmetriche, ovvero spostano gli stessi dati da e verso Google Cloud. Puoi definire la struttura di un file QSAM in un file di copia utilizzando la definizione della struttura di dati COBOL. Puoi anche definire trasformazioni avanzate utilizzando il file di configurazione del transcoder Mainframe Connector. I seguenti diagrammi descrivono queste operazioni in dettaglio.


Questa pagina fornisce una panoramica del processo di transcodifica utilizzando i comandi qsam decode
e qsam encode
, i tipi fisici e logici dei dati mainframe e le mappature dei tipi ORC (Optimized Row Columnar) e BigQuery.
Tipi fisici
I tipi fisici definiscono la disposizione dei dati di campo su un disco. I tipi fisici vengono convertiti in tipi logici di Mainframe Connector che possono poi essere mappati ai tipi di database (ORC o BigQuery).
Campi alfanumerici
I campi alfanumerici vengono utilizzati per elaborare stringhe alfanumeriche. I dati vengono trattati come una serie di caratteri e archiviati come stringhe con una codifica specifica, ad esempio EBCDIC (Extended Binary Coded Decimal Interchange Code).
Il processo di transcodifica non termina se si verificano errori durante la codifica o la decodifica dei campi alfanumerici. Al suo posto, nella posizione in cui si è verificato l'errore viene inserito un carattere SUB
per la codifica e la procedura di transcodifica continua.
Simboli di immagini | Attributi delle immagini | Tipo logico |
---|---|---|
A, B, G, N, U, X, 9 | DISPLAY, DISPLAY-1, NATIONAL, UTF-8 | Stringa |
Esempio
01 REC 02 STR PIC X(10) 02 NATIONAL PIC N(10) 02 UTF8 PIC U(1) USAGE UTF-8
Formato di codifica
I campi alfanumerici vengono codificati come segue:
- Per impostazione predefinita, i campi X utilizzano la codifica EBCDIC
- Per impostazione predefinita, i campi nazionali (N) utilizzano la codifica UTF-16 BE (Unicode Transformation Format 16-bit).
- Per impostazione predefinita, i campi UTF8 utilizzano la codifica Unicode Transformation Format-8 (UTF-8)
Mainframe Connector supporta la maggior parte delle codifiche dei set di caratteri a singolo byte (SBCS) e dei set di caratteri a doppio byte (DBCS). Se necessario, puoi anche definire la tua codifica SBCS personalizzata.
Campi binari (COMPUTATIONAL)
I campi binari vengono archiviati come numeri interi big-endian con segno o senza segno. Mainframe Connector memorizza sempre i campi binari in modo logico come interi a 64 bit con segno. Pertanto, gli input unsigned long devono utilizzare solo i 63 bit inferiori, altrimenti il processo di transcodifica non va a buon fine.
Simboli di immagini | Attributi delle immagini | Tipo logico |
---|---|---|
S, 9 | COMP, COMPUTATIONAL | Lungo (intero a 64 bit con segno) |
Esempio
01 REC 02 INT PIC S9(8) COMP
Campi a virgola mobile esadecimali (COMP-1, COMP-2)
I campi in virgola mobile esadecimale (HFP) sono completamente supportati. Mainframe Connector utilizza formati sia a precisione singola che doppia per i campi HFP.
Simboli di immagini | Attributi delle immagini | Tipo logico |
---|---|---|
COMP-1, COMP-2 | Doppio (virgola mobile con segno a 64 bit) |
Esempio
01 REC 03 HFP-SINGLE COMP-1. 03 HFP-DOUBLE COMP-2.
Campi decimali compressi (COMP-3)
I campi decimali compressi sono completamente supportati. Durante la procedura di transcodifica, Mainframe Connector seleziona il tipo logico con il rendimento migliore in base alla precisione e alla scala specificate.
Simboli di immagini | Attributi delle immagini | Tipo logico |
---|---|---|
S, 9, V | COMP-3 | Long (numero intero a 64 bit con segno), BigInteger, Decimal64, BigDecimal |
Esempio
01 REC 02 DEC PIC S9(2)V9(8) COMP-3
Campo decimale con zona (DISPLAY)
I campi decimali con zona sono completamente supportati. Durante la procedura di transcodifica, Mainframe Connector seleziona il tipo logico con il rendimento migliore in base alla precisione e alla scala specificate.
Simboli di immagini | Attributi delle immagini | Tipo logico |
---|---|---|
S, 9, V | DISPLAY | Long (numero intero a 64 bit con segno), BigInteger, Decimal64, BigDecimal |
Esempio
01 REC 02 DEC PIC S9(2)V9(8) DISPLAY
Elenchi (OCCURS)
Gli elenchi sono raccolte ordinate di elementi dello stesso tipo. Mainframe Connector supporta i seguenti tipi di elenchi:
Elenchi fissi
Gli elenchi fissi vengono utilizzati quando il numero esatto di elementi (conteggio elementi) che faranno parte dell'elenco è noto in anticipo e questo numero rimane sempre invariato. Gli elementi di un elenco fisso possono avere dimensioni variabili.
Gli elenchi fissi sono definiti come segue in un modello:
01 REC.
02 LIST OCCURS 5 TIMES PIC X(1).
02 FLD PIC X(5).
L'immagine seguente mostra il layout di un elenco fisso con un conteggio di elementi pari a 5.

Elenchi dinamici
Gli elenchi dinamici vengono utilizzati quando il numero massimo di elementi che faranno parte dell'elenco è noto in anticipo. Tuttavia, il numero effettivo di elementi è sconosciuto e dipende da un altro campo. Gli elementi di un elenco dinamico possono essere di dimensioni variabili.
Le proprietà degli elenchi dinamici sono le seguenti:
- Il campo della lunghezza può essere convertito in un numero intero senza perdita di precisione.
- Il campo Lunghezza deve essere in ambito.
- Il numero minimo di articoli non viene applicato durante il processo di transcodifica.
Gli elenchi dinamici sono definiti come segue in un archivio:
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).
L'immagine seguente mostra il layout di un elenco dinamico con un numero massimo di elementi pari a cinque.

Elenchi dinamici compressi
Gli elenchi dinamici compressi vengono utilizzati quando il numero massimo di elementi che faranno parte dell'elenco dipende da un altro campo e gli elementi sono compressi.
Le proprietà degli elenchi dinamici compressi sono le seguenti:
- Il campo della lunghezza può essere convertito in un numero intero senza perdita di precisione.
- Il campo Lunghezza deve essere in ambito.
- Il numero minimo di articoli non viene applicato durante il processo di transcodifica.
Gli elenchi dinamici compressi sono definiti come segue in un modello:
01 REC.
02 LEN PIC S9(2) BINARY.
02 LIST OCCURS UNBOUNDED
DEPENDING ON LEN PIC X(1).
02 FLD PIC X(5).
L'immagine seguente mostra il layout di un elenco dinamico compresso.

Ridefinizioni (REDEFINES)
Le ridefinizioni sono una funzionalità COBOL che consente agli stessi dati di avere più possibili modi di decodifica. Durante la procedura di decodifica, le ridefinizioni vengono visualizzate come colonne aggiuntive nella tabella risultante e i dati vengono decodificati più volte.
Le proprietà delle ridefinizioni sono le seguenti:
- Le ridefinizioni degli stessi dati sottostanti non sono campi di pari livello e quindi non rientrano nell'ambito l'una dell'altra.
- I campi ridefiniti vengono decodificati quando viene decodificato il campo sottostante, non quando vengono dichiarati. Il campo sottostante determina anche l'ambito dei campi ridefiniti.
- Tutti i campi ridefiniti devono avere le stesse dimensioni e devono essere di dimensioni fisse. Ciò significa che non puoi utilizzare campi di testo con lunghezza variabile ed elenchi dinamici compressi nei campi ridefiniti.
Le ridefinizioni sono definite come segue in un modello:
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).
L'immagine seguente mostra il layout di un campo ridefinito.

Puoi utilizzare le ridefinizioni in molti modi, tra cui i seguenti più comuni:
Visualizza gli stessi dati in due modi diversi: questo è il modo più comune di utilizzare le ridefinizioni. Durante la procedura di codifica, l'ordine in cui vengono compilati i dati non è definito, pertanto devi assicurarti che i dati in BigQuery mantengano la loro integrità durante l'esportazione.
Esempio
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).
Utilizza l'unione con tag: le unioni con tag sono un modo comune per utilizzare le ridefinizioni quando hai bisogno di una sola delle interpretazioni dei dati di qualsiasi record, a seconda di un campo. Puoi utilizzare indicatori null per contrassegnare come nulle le interpretazioni non necessarie. In questo modo, inoltre, eviterai che vengano analizzati a causa degli indicatori nulli con valutazioni lazy. Le proprietà degli union con tag sono le seguenti:
- Il processo di codifica non va a buon fine se è definita più di una ridefinizione.
- Sono implementati solo i controlli di uguaglianza e non uguaglianza.
Esempio
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).
Puoi utilizzare l'esempio seguente per implementare un'unione con 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": {}} } ] }
Tipi logici
Per transcodificare i dati in entrata e in uscita da più formati, Mainframe Connector converte tutti i dati in una rappresentazione intermedia (IR) basata su tipi logici. I formati di input e di output definiscono la modalità di conversione dei dati in qualsiasi tipo logico e viceversa. La tabella seguente elenca tutti i tipi logici supportati da Mainframe Connector.
Tipo logico | Descrizione |
---|---|
Lungo | Rappresenta un numero a 64 bit con segno. |
Stringa | Rappresenta una stringa di caratteri Unicode non correlata a alcuna codifica specifica. Qualsiasi punto di codice Unicode valido è rappresentabile. Tuttavia, alcuni caratteri potrebbero non essere codificabili in tutte le procedure di codifica. Le stringhe logiche sono di lunghezza variabile. |
Decimal64 | Rappresenta un numero decimale con un intervallo che può essere inserito in un numero intero con segno a 64 bit di qualsiasi scala. |
BigInteger | Rappresenta numeri interi di qualsiasi dimensione. |
BigDecimal | Rappresenta numeri decimali di qualsiasi scala e precisione. |
Byte | Rappresenta un array di byte di dimensioni variabili. |
Data | Rappresenta una data indipendente da un fuso orario specifico. |
Doppio | Rappresenta un numero a virgola mobile a precisione doppia come descritto nello standard IEEE per l'aritmetica in virgola mobile (IEEE 754). |
Elenco | Rappresenta un elenco di elementi di un tipo specifico. L'elenco può contenere un numero arbitrario di elementi. |
Registra | Rappresenta una serie fissa di campi di tipi diversi. |
Timestamp | Rappresenta un timestamp indipendente da un fuso orario specifico. |
Mappatura del tipo di ORC
La tabella seguente fornisce la mappatura tra i tipi di dati di Mainframe Connector ai tipi ORC.
Tipo logico | Tipo di ORC |
---|---|
Lungo | Numero intero a 64 bit (bigint) |
Stringa | Stringa codificata UTF-8 |
Decimal64 | decimal64 |
BigInteger | decimal |
BigDecimal | decimal |
Byte | blob binario |
Data | data |
Doppio | float64 |
Elenco | list |
Registra | struct |
Timestamp | timestamp (senza fuso orario locale) |
Mappatura dei tipi BigQuery
La tabella seguente fornisce la mappatura tra i tipi logici di Mainframe Connector ai tipi di dati BigQuery.
Tipo logico | Tipo di dati BigQuery | Commenti |
---|---|---|
Lungo | INT64 | |
Stringa | STRING | |
Decimal64 | NUMERIC | |
BigInteger | NUMERIC | |
BigDecimal | NUMERIC | |
Byte | BYTES | |
Data | DATA | |
Doppio | FLOAT64 | |
Elenco | ARRAY | Gli elenchi nidificati e gli elenchi di mappe non sono supportati. |
Registra | STRUCT | Quando un'unione ha una sola variante, viene convertita in un campo NULLABLE.
In caso contrario, un'unione viene convertita in un RECORD con un elenco di campi NULLABLE.
I campi NULLABLE hanno suffissi come field_0 ,
field_1 . Solo a uno di questi campi viene assegnato un valore quando i dati vengono letti. |
Timestamp | TIMESTAMP |
Ambito del campo
Un campo è considerato nell'ambito di un altro campo se è uno dei seguenti:
- Un campo fratello definito prima del campo che lo richiede.
- Un campo in un record principale definito prima del campo che lo richiede.