Riferimento ai comandi qsam

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.

Decodifica i dati del mainframe in Google Cloud
Decodifica i dati del mainframe in Google Cloud
Codifica i dati del mainframe da Google Cloud
Codice Google Cloud i dati per il mainframe

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.

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

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

Layout di un elenco dinamico compresso
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.

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