Riferimento ai comandi qsam

Mainframe Connector transcodifica i file flat Queued Sequential Access Method (QSAM) in formati compatibili con Google Cloud 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 i dati Google Cloud nel 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 copybook utilizzando la definizione della struttura dei dati COBOL. Puoi anche definire trasformazioni avanzate utilizzando il file di configurazione del transcodificatore di Mainframe Connector. I seguenti diagrammi descrivono queste operazioni in dettaglio.

Decodifica i dati del mainframe in Google Cloud
Decodifica i dati del mainframe in Google Cloud
Codifica i dati del mainframe da Google Cloud
Codifica i dati Google Cloud nel mainframe

Questa pagina fornisce una panoramica del processo di transcodifica utilizzando i comandi qsam decode e qsam encode, i tipi fisici e logici di dati mainframe e i mapping dei tipi Optimized Row Columnar (ORC) e BigQuery.

Tipi fisici

I tipi fisici definiscono il modo in cui i dati dei campi vengono disposti 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 vengono archiviati come stringhe con una codifica specifica, ad esempio Extended Binary Coded Decimal Interchange Code (EBCDIC). Il processo di transcodifica non termina se si verificano errori durante la codifica o la decodifica dei campi alfanumerici. Al suo posto, viene inserito un carattere SUB per la codifica nella posizione in cui si è verificato l'errore e il processo di transcodifica continua.

Simboli con immagini Attributi immagine 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 sono codificati come segue:

  • X campi sono impostati per impostazione predefinita sulla codifica EBCDIC
  • I campi nazionali (N) utilizzano per impostazione predefinita la codifica Unicode Transformation Format a 16 bit (UTF-16 BE)
  • I campi UTF8 utilizzano per impostazione predefinita la codifica Unicode Transformation Format-8 (UTF-8)

Mainframe Connector supporta la maggior parte delle codifiche di set di caratteri a singolo byte (SBCS) e 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 archivia sempre i campi binari in modo logico come numeri 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 con immagini Attributi immagine Tipo logico
S, 9 COMP, COMPUTATIONAL Long (intero a 64 bit con segno)

Esempio

01 REC
  02 INT PIC S9(8) COMP

Campi in virgola mobile esadecimali (COMP-1, COMP-2)

I campi in virgola mobile esadecimale (HFP) sono completamente supportati. Mainframe Connector utilizza formati a precisione singola e doppia per i campi HFP.

Simboli con immagini Attributi immagine Tipo logico
COMP-1, COMP-2 Double (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 il processo di transcodifica, Mainframe Connector seleziona il tipo logico più performante in base alla precisione e alla scala specificate.

Simboli con immagini Attributi immagine Tipo logico
S, 9, V COMP-3 Long (intero a 64 bit con segno), BigInteger, Decimal64, BigDecimal

Esempio

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

Campo decimale compattato (DISPLAY)

I campi decimali con segno sono completamente supportati. Durante il processo di transcodifica, Mainframe Connector seleziona il tipo logico più performante in base alla precisione e alla scala specificate.

Simboli con immagini Attributi immagine Tipo logico
S, 9, V DISPLAY Long (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 lo stesso. Gli elementi di un elenco fisso possono avere dimensioni variabili.

Gli elenchi fissi sono definiti come segue in un copybook:

       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 degli elementi pari a 5.

Layout di un elenco fisso
Layout di un elenco fisso

Elenchi dinamici

Gli elenchi dinamici vengono utilizzati quando il numero massimo di elementi che faranno parte dell'elenco è noto in anticipo. Tuttavia, il conteggio effettivo degli elementi è sconosciuto e dipende da un altro campo. Gli elementi di un elenco dinamico possono avere 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 della lunghezza deve essere incluso nell'ambito.
  • Il conteggio minimo degli elementi non viene applicato durante il processo di transcodifica.

Gli elenchi dinamici sono definiti come segue in un 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).

L'immagine seguente mostra il layout di un elenco dinamico con un numero massimo di elementi pari a cinque.

Layout di un elenco dinamico
Layout di un elenco dinamico

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 della lunghezza deve essere nell'ambito.
  • Il conteggio minimo degli elementi non viene applicato durante il processo di transcodifica.

Gli elenchi dinamici compressi sono definiti come segue in un copybook:

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.

Layout di un elenco dinamico compresso
Layout di un elenco dinamico compresso

Ridefinizioni (REDEFINES)

Ridefinizioni è una funzionalità COBOL che consente agli stessi dati di avere più possibilità di decodifica. Durante il processo 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 correlati e pertanto non rientrano nell'ambito l'uno dell'altro.
  • 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 avere una dimensione fissa. Ciò significa che non puoi utilizzare campi di testo a lunghezza variabile ed elenchi dinamici compressi nei campi ridefiniti.

Le ridefinizioni sono definite come segue in un 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).

L'immagine seguente mostra il layout di un campo ridefinito.

Layout di un campo ridefinito
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 in cui vengono utilizzate le ridefinizioni. Durante il processo di codifica, l'ordine in cui vengono inseriti i dati non è definito, pertanto devi assicurarti che i dati in BigQuery mantengano la loro integrità quando vengono esportati.

    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 di utilizzare le ridefinizioni quando hai bisogno di una sola delle interpretazioni dei dati di qualsiasi record, a seconda di un campo. Puoi utilizzare gli indicatori null per contrassegnare le interpretazioni non necessarie come nulle. In questo modo, non verranno analizzati a causa di indicatori null con valutazioni lazy. Le proprietà delle unioni taggate sono le seguenti:

    • Il processo di codifica non riesce se viene 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 il seguente esempio 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 più formati e da più formati, Mainframe Connector converte tutti i dati in una rappresentazione intermedia (IR) basata su tipi logici. I formati di input e output definiscono la modalità di conversione dei dati da e verso qualsiasi tipo logico. La tabella seguente elenca tutti i tipi logici supportati da Mainframe Connector.

Tipo logico Descrizione
BigDecimal Rappresenta numeri decimali di qualsiasi scala e precisione.
BigInteger Rappresenta numeri interi di qualsiasi dimensione.
Byte Rappresenta un array di byte di dimensioni variabili.
Data Rappresenta una data indipendente da un fuso orario specifico.
Decimal64 Rappresenta un numero decimale con un intervallo che può essere inserito in un numero intero con segno a 64 bit di qualsiasi scala.
Doppio Rappresenta un numero in 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.
Lungo Rappresenta un numero a 64 bit con segno.
Registra Rappresenta una serie fissa di campi di vari tipi.
Stringa Rappresenta una stringa di caratteri Unicode non correlata a una codifica specifica. È rappresentabile qualsiasi punto di codice Unicode valido. Tuttavia, alcuni caratteri potrebbero non essere codificabili in tutti i processi di codifica. Le stringhe logiche hanno lunghezza variabile.
Timestamp Rappresenta un timestamp indipendente da un fuso orario specifico.

Mappatura del tipo ORC

La seguente tabella fornisce il mapping tra i tipi logici di Mainframe Connector e i tipi ORC.

Tipo logico Tipo di ORC
BigDecimal decimal
BigInteger decimal
Byte blob binario
Data data
Decimal64 decimal64
Doppio float64
Elenco list
Lungo Intero a 64 bit (bigint)
Registra struct
Stringa Stringa codificata UTF-8
Timestamp timestamp (senza fuso orario locale)

Mappatura dei tipi BigQuery

La tabella seguente fornisce il mapping tra i tipi logici di Mainframe Connector e i tipi di dati BigQuery.

Tipo logico Tipo di dati BigQuery Commenti
BigDecimal NUMERIC
BigInteger NUMERIC
Byte BYTES
Data DATA
Decimal64 NUMERIC
Doppio FLOAT64
Elenco ARRAY Gli elenchi nidificati e gli elenchi di mappe non sono supportati.
Lungo INT64
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 uno di questi campi viene assegnato a un valore quando i dati vengono letti.
Stringa STRING
Timestamp TIMESTAMP

Ambito del campo

Un campo viene considerato in ambito per un altro campo se è uno dei seguenti:

  • Un campo correlato definito prima del campo che lo richiede.
  • Un campo in un record principale definito prima del campo che lo richiede.