SnowConvert AI – Teradata – BTEQ

Übersetzungsreferenzen zur Konvertierung von Teradata-BTEQ-Dateien in Python

Basic Teradata Query (BTEQ) ist ein allgemeines, befehlsbasiertes Programm, das es Benutzern auf einer Workstation ermöglicht, mit einem oder mehreren Teradata-Datenbanksystemen zu kommunizieren und Berichte sowohl für die Druck- als auch für die Bildschirmausgabe zu formatieren.

Um die BTEQ-Funktionalität für Teradata in Snowflake zu simulieren, werden BTEQ-Dateien und -Befehle in Python-Code umgewandelt, ähnlich wie die Transformationen, die für MultiLoad- und FastLoad-Skripte ausgeführt werden. Der generierte Code verwendet das Snowflake-Python-Projekt namens snowconvert.helpers, das die erforderlichen Funktionen zur Simulation der BTEQ-Anweisungen in Snowflake enthält.

Übersetzung von BTEQ-Befehlen

Die folgende Tabelle zeigt die Konvertierung der BTEQ-Befehle in Snowflake.

Teradata

Snowflake

Anmerkungen

ERRORCODE != 0

snowconvert.helpers.error_code != 0

.EXPORT DATA FILE=fileName

Export.report(„fileName“, „,“)

Die Funktion hat keine Funktionalität

.EXPORT INDICDATA FILE=fileName

Export.report(„fileName“, „,“)

Die Funktion hat keine Funktionalität

.EXPORT REPORT FILE=fileName

Export.report(„fileName“, „,“)

Die Funktion hat keine Funktionalität

.EXPORT DIF FILE=fileName

Export.report(„fileName“, „,“)

Die Funktion hat keine Funktionalität

.EXPORT RESET

Export.reset()

Die Funktion hat keine Funktionalität

.IF ERRORCODE! = 0 THEN.QUIT ERRORCODE

Wenn snowconvert.helpers.error_code != 0: snowconvert.helpers.quit_application (snowconvert.helpers.error_code)

.IMPORT RESET

snowconvert.helpers.import_reset()

Die Funktion hat keine Funktionalität

.LABEL newLabel

def NEWLABEL():
snowconvert.helpers.quit_application()

.LOGOFF

Die Anweisung ist kommentiert

.LOGON

Die Anweisung ist kommentiert

.LOGMECH

Die Anweisung ist kommentiert

.OS /fs/fs01/bin/filename.sh ‚load‘

snowconvert.helpers.os(„“/fs/fs01/bin/filename.sh ‚load‘ „“)

.RUN FILE=newFile

for statement in snowconvert.helpers.readrun(„newFile“): eval(statement)

.SET DEFAULTS

Export.defaults()

Die Funktion hat keine Funktionalität

.SETERRORLEVEL 3807 SEVERITY 0

snowconvert.helpers.set_error_level(3807, 0)

.SET RECORMODE OFF

Export.record_mode(False)

.SET RECORMODE ON

Export.record_mode(True)

.SETSEPARATOR ‚|‘

Export.separator_string(‚|‘)

Die Funktion hat keine Funktionalität

.SETWIDTH 120

Export.Breite(120)

Die Funktion hat keine Funktionalität

.Remark „“Hello world!“““

snowconvert.helpers.remark(r““““““Hello world!““““““)

.QUIT ERRORCODE

snowconvert.helpers.quit_application(

snowconvert.helpers.error_code

)

.QUIT

snowconvert.helpers.quit_application()

SQL-Anweisungen

exec(statement)

$(<$INPUT_SQL_FILE)

exec_file(„$INPUT_SQL_FILE“)

= (Repeat previous command)

snowconvert.helpers.repeat_previous\_sql_statement(con)

Für kompliziertere Anweisungen, die in der vorherigen Tabelle dargestellt sind, werden Unterabschnitte mit ausführlicheren Beispielen erläutert.

.GOTO-Konvertierung

Da wir BTEQ-Skripte nach Python konvertieren, werden bestimmte Strukturen, die in BTEQ gültig sind, in Python nicht unterstützt. Dies ist der Fall für den Befehl .GOTO unter Verwendung der Befehle . Label.

Aus diesem Grund wurde eine Alternative entwickelt, mit der die Funktionalität dieser Befehle emuliert werden kann, indem die Befehle . Label in Funktionen mit nachfolgenden Aufrufanweisungen umgewandelt werden.

Prüfen Sie den folgenden Code:

 .LABEL FIRSTLABEL
SELECT * FROM MyTable1;
.LABEL SECONDLABEL
SELECT * FROM MyTable2;
SELECT * FROM MyTable3;
Copy

In dem obigen Beispiel gab es fünf Befehle. Zwei davon waren. Label-Befehle. Der BefehlFIRSTLABELwurde in eine Funktion mit den nachfolgenden Anweisungen umgewandelt, bis ein weiterer.LABEL-Befehl gefunden wird. Wenn ein anderes Label aufgerufen wird (in diesem Fall SECONDLABEL), beendet dieser Aufruf die erste Funktion und startet eine neue.

Wenn wir das vorherige Beispiel migrieren würden, würde das Ergebnis folgendermaßen lauten:

 #*** Generated code is based on the SnowConvert AI Python Helpers version 2.0.6 ***
 
import os
import sys
import snowconvert.helpers
from snowconvert.helpers import Export
from snowconvert.helpers import exec
from snowconvert.helpers import BeginLoading
con = None
def main():
  snowconvert.helpers.configure_log()
  con = snowconvert.helpers.log_on()
  FIRSTLABEL()
  snowconvert.helpers.quit_application()
def FIRSTLABEL():
  exec("""
    SELECT
      *
    FROM
      MyTable1
    """)
  SECONDLABEL()
def SECONDLABEL():
  exec("""
    SELECT
      *
    FROM
      MyTable2
    """)
  exec("""
    SELECT
      *
    FROM
      MyTable3
    """)

if __name__ == "__main__":
  main()
Copy

Beachten Sie den Aufruf der Funktion FIRSTLABEL. Diese Funktion enthält nur eine Anweisung, die die einzige Nicht-Label-Anweisung wäre, die im ursprünglichen Code auf FIRSTLABEL folgt. Bevor die FIRSTLABEL-Funktion endet, ruft sie SECONDLABEL mit den darauf folgenden Anweisungen auf.

  • Anmerkungen:

    • Erstellen einer Konnektorvariable con = None, und Auffüllen in der Funktion main(): con = snowconvert.helpers.log_on().

    • Einrichten eines Protokolls: snowconvert.helpers.configure_log().

Abfrage ausführen (Anweisungen)

Jede in einer BTEQ-Datei gefundene SQL-Anweisung wird über die exec-Funktion ausgeführt, die von den snowconvert.helpers bereitgestellt wird. Nehmen Sie zum Beispiel den folgenden Code:

 CREATE TABLE aTable (aColumn BYTEINT);
Copy

Dies wird umgerechnet in:

 #*** Generated code is based on the SnowConvert AI Python Helpers version 2.0.6 ***
 
import os
import sys
import snowconvert.helpers
from snowconvert.helpers import Export
from snowconvert.helpers import exec
from snowconvert.helpers import BeginLoading
con = None
def main():
  snowconvert.helpers.configure_log()
  con = snowconvert.helpers.log_on()
  exec("""
    CREATE OR REPLACE TABLE aTable (
      aColumn BYTEINT
    )
    """)
  snowconvert.helpers.quit_application()

if __name__ == "__main__":
  main()
Copy

Skript-Dateien ausführen

Dateien, die die BTEQ-Befehle eines Benutzers und Teradata SQL Anweisungen enthalten, werden Skripte, Ausführungsdateien, Makros oder gespeicherte Prozeduren genannt. Erstellen Sie beispielsweise eine Datei mit dem Namen SAMPFILE, und geben Sie das folgende Skript BTEQ ein:

    .LOGON tdpid/userid,password 
   SELECT * FROM department;
   .LOGOFF
Copy

Um die Ausführungsdatei auszuführen, geben Sie eine der beiden Formen des Befehls BTEQ RUN ein:

.RUN FILE=sampfile

Copy

Wenn Sie den zweiten Code umwandeln, erhalten Sie das folgende Ergebnis:

 #*** Generated code is based on the SnowConvert AI Python Helpers version 2.0.6 ***
 
import os
import sys
import snowconvert.helpers
from snowconvert.helpers import Export
from snowconvert.helpers import exec
from snowconvert.helpers import BeginLoading
con = None
def main():
  snowconvert.helpers.configure_log()
  con = snowconvert.helpers.log_on()

  for statement in snowconvert.helpers.readrun(fr"sampfile"):
    eval(statement)
  snowconvert.helpers.quit_application()

if __name__ == "__main__":
  main()
Copy

snowconvert.helpers.readrun("sampfile") gibt jede Zeile aus der SAMPFILE zurück und in derFOR-Anweisung wird jede der Zeilen an die eval-Funktion übergeben, eine Methode, die den ihr übergebenen Ausdruck parst und den Python-Ausdruck (die SAMPFILE sollte konvertiert werden, um zu funktionieren) innerhalb des Programms ausführt.

SQL-Dateien ausführen

In einigen Fällen kann während der Ausführung einer BTEQ-Datei eine SQL-Datei gefunden werden, z. B. die SQL-Datei mit dem Namen NEWSQL:

 CREATE TABLE aTable (aColumn BYTEINT);
Copy

Dies kann während eines Skripts mit der folgenden Zeile ausgeführt werden:

 $(<$NEWSQL)
Copy

Und nach der Konvertierung des Skripts lautet das Ergebnis:

 #*** Generated code is based on the SnowConvert AI Python Helpers version 2.0.6 ***
 
import os
import sys
import snowconvert.helpers
from snowconvert.helpers import Export
from snowconvert.helpers import exec
from snowconvert.helpers import BeginLoading
con = None
def main():
  snowconvert.helpers.configure_log()
  con = snowconvert.helpers.log_on()
  exec("""
    CREATE OR REPLACE TABLE aTable (
      aColumn BYTEINT
    )
    """)
  snowconvert.helpers.quit_application()

if __name__ == "__main__":
  main()
Copy

Die Hilfsfunktion exec_file liest jede Zeile aus der Datei NEWSQL und verwendet dann die Funktion „exec“ wie im Abschnitt Abfrageanweisung ausführen beschrieben.

Bekannte Probleme

Es wurden keine Probleme gefunden.

REPEAT

Übersetzungsspezifikation für die REPEAT-Anweisung.

Bemerkung

Einige Teile des Ausgabecodes wurden aus Gründen der Übersichtlichkeit weggelassen.

Wie in der Dokumentation von Teradata beschrieben, können Benutzer mit der REPEAT-Anweisung angeben, wie oft die nächste SQL-Anfrage maximal gestellt werden soll. Beachten Sie, dass es sich bei einer SQL-Anfrage um eine Einzel- oder Mehrfachanforderung handeln kann. Dies wird durch die Position der Semikolons für jede Anweisung nach der REPEAT-Anweisung definiert.

Syntax

REPEAT [ n [ PACK p [ REQBUFLEN b ] ] | * | RECS r]
<sql_request>

Copy

Beispielhafte Quellcode-Muster

Mit diesen Eingabedaten:

inputData.dat

A B C
D E F
G H I

Copy
inputData2.dat
* [
] *

Copy

Teradata:

Abfrage
 .IMPORT DATA FILE = inputData.dat;
.REPEAT *
USING var_1 (CHARACTER), var_2 (CHARACTER), var_3 (CHARACTER)
INSERT INTO testtabu (c1) VALUES (:var_1)
;INSERT INTO testtabu (c1) VALUES (:var_2) 
;INSERT INTO testtabu (c1) VALUES (:var_3) 
;UPDATE testtabu 
   SET c2 = 'X'
   WHERE c1 = :var_1 
;UPDATE testtabu 
   SET c2 = 'Y' 
   WHERE c1 = :var_2 
;UPDATE testtabu 
   SET c2 = 'Z'
   WHERE c1 = :var_3
;INSERT INTO TESTTABU (c1, c2) VALUES ('?','_');

.REPEAT 10
INSERT INTO TESTTABU2 VALUES ('John Doe', 23);

.REPEAT RECS 5
INSERT INTO TESTTABU2 VALUES ('Bob Alice', 21);

.IMPORT DATA FILE = inputData2.dat;
USING (var_1 CHARACTER, var_2 CHARACTER)
INSERT INTO testtabu (c1) VALUES (:var_1) 
;INSERT INTO testtabu (c1) VALUES (:var_2);
Copy
TESTTABU-Ergebnis
C1C2
AX
DX
GX
BY
EY
HY
CZ
FZ
IZ
?_
?_
?_
*null
[null
TESTTABU2-Ergebnis
MY_NAMEMY_AGE
John Doe23
John Doe23
John Doe23
John Doe23
John Doe23
John Doe23
John Doe23
John Doe23
John Doe23
John Doe23
Bob Alice21
Bob Alice21
Bob Alice21
Bob Alice21
Bob Alice21

Snowflake:

Abfrage
 #*** Generated code is based on the SnowConvert AI Python Helpers version 2.0.6 ***
 
import os
import sys
import snowconvert.helpers
from snowconvert.helpers import Export
from snowconvert.helpers import exec
from snowconvert.helpers import BeginLoading
con = None
def main():
  snowconvert.helpers.configure_log()
  con = snowconvert.helpers.log_on()
  snowconvert.helpers.import_file(fr"inputData.dat")
  ssc_repeat_value = '*'
  ssc_max_iterations = 1

  for ssc_repeat_position in range(0, ssc_max_iterations):

    if ssc_repeat_position == 0:
      using = snowconvert.helpers.using("var_1", "CHARACTER", "var_2", "CHARACTER", "var_3", "CHARACTER", rows_to_read = ssc_repeat_value)
      exec("""
        INSERT INTO testtabu (c1)
        VALUES (:var_1)
        """, using = using)
      exec("""
        INSERT INTO testtabu (c1)
        VALUES (:var_2)
        """, using = using)
      exec("""
        INSERT INTO testtabu (c1)
        VALUES (:var_3)
        """, using = using)
      exec("""
        UPDATE testtabu
          SET
            c2 = 'X'
          WHERE
            c1 = :var_1
        """, using = using)
      exec("""
        UPDATE testtabu
          SET
            c2 = 'Y'
          WHERE
            c1 = :var_2
        """, using = using)
      exec("""
        UPDATE testtabu
          SET
            c2 = 'Z'
          WHERE
            c1 = :var_3
        """, using = using)
      exec("""
        INSERT INTO TESTTABU (c1, c2)
        VALUES ('?', '_')
        """, using = using)

  ssc_repeat_value = 10
  ssc_max_iterations = 10

  for ssc_repeat_position in range(0, ssc_max_iterations):
    exec("""
      INSERT INTO TESTTABU2
      VALUES ('John Doe', 23)
      """)
  ssc_repeat_value = 5
  ssc_max_iterations = 5

  for ssc_repeat_position in range(0, ssc_max_iterations):
    exec("""
      INSERT INTO TESTTABU2
      VALUES ('Bob Alice', 21)
      """)
  snowconvert.helpers.import_file(fr"inputData2.dat")
  using = snowconvert.helpers.using("var_1", "CHARACTER", "var_2", "CHARACTER", rows_to_read = 1)
  exec("""
    INSERT INTO testtabu (c1)
    VALUES (:var_1)
    """, using = using)
  exec("""
    INSERT INTO testtabu (c1)
    VALUES (:var_2)
    """, using = using)
  snowconvert.helpers.quit_application()

if __name__ == "__main__":
  main()
Copy
TESTTABU-Ergebnis
C1C2
AX
DX
GX
BY
EY
HY
CZ
FZ
IZ
?_
?_
?_
*null
[null
TESTTABU2-Ergebnis
MY_NAMEMY_AGE
John Doe23
John Doe23
John Doe23
John Doe23
John Doe23
John Doe23
John Doe23
John Doe23
John Doe23
John Doe23
Bob Alice21
Bob Alice21
Bob Alice21
Bob Alice21
Bob Alice21

Bekannte Probleme

Es wurden keine Probleme gefunden.

Zugehörige EWIs

Keine zugehörigen EWIs.

USING REQUEST MODIFIER

Übersetzungsspezifikation für die USING REQUEST MODIFIER-Abfrage.

Bemerkung

Einige Teile des Ausgabecodes wurden aus Gründen der Übersichtlichkeit weggelassen.

Wie in der Teradata-Dokumentation beschrieben, definiert USING REQUEST MODIFIER einen oder mehrere variable Parameternamen, die in den nachfolgenden SELECT-, INSERT-, UPDATE- oder DELETE-Anweisungen zum Importieren oder Exportieren von Daten verwendet werden.

Die Syntax für diese Anweisung lautet wie folgt:

 USING ( <using_spec> [,...] ) SQL_request

<using_spec> ::= using_variable_name data_type [ data_type_attribute [...] ]
  [ AS { DEFERRED [BY NAME] | LOCATOR } ]
Copy

Wie in der Dokumentation von Teradata angegeben, muss USING REQUEST MODIFIER eine .IMPORT-Anweisung vorangestellt werden, damit die Daten in die definierten Parameter geladen werden.

Die Transformation für diese Anweisung folgt also diesen Schritten:

  1. Rufen Sie die import_file()-Funktion über die SnowConvert AI-Hilfsfunktionen auf. Dadurch werden die Daten in eine temporäre Datei geladen.

  2. Rufen Sie die using()-Funktion über die SnowConvert AI-Hilfsfunktionen auf, um ein Wörterbuch mit den geladenen Daten zu erstellen.

  3. Führen Sie für jede Abfrage die exec()-Funktion über die SnowConvert AI-Hilfsfunktionen auf und übergeben das zuvor definierte Wörterbuch. Dabei werden die Datenbindungsfunktionen des Python-Konnektors von Snowflake verwendet.

Mit diesen Eingabedaten:

 A,B,C
Copy

Teradata (MultiLoad)

Abfrage

 .IMPORT DATA FILE = inputData.dat;
USING var_1 (CHARACTER), var_2 (CHARACTER), var_3 (CHARACTER)
INSERT INTO testtabu (c1) VALUES (:var_1)
;INSERT INTO testtabu (c1) VALUES (:var_2) 
;INSERT INTO testtabu (c1) VALUES (:var_3) 
;UPDATE testtabu 
   SET c2 = 'X'
   WHERE c1 = :var_1 
;UPDATE testtabu 
   SET c2 = 'Y' 
   WHERE c1 = :var_2 
;UPDATE testtabu 
   SET c2 = 'Z'
   WHERE c1 = :var_3;
Copy

Ergebnis

ROWC1C2
1AX
2BY
3CZ

Snowflake (Python)

Abfrage
 #*** Generated code is based on the SnowConvert AI Python Helpers version 2.0.6 ***
 
import os
import sys
import snowconvert.helpers
from snowconvert.helpers import Export
from snowconvert.helpers import exec
from snowconvert.helpers import BeginLoading
con = None
def main():
  snowconvert.helpers.configure_log()
  con = snowconvert.helpers.log_on()
  snowconvert.helpers.import_file(fr"inputData.dat")
  using = snowconvert.helpers.using("var_1", "CHARACTER", "var_2", "CHARACTER", "var_3", "CHARACTER", rows_to_read = 1)
  exec("""
    INSERT INTO testtabu (c1)
    VALUES (:var_1)
    """, using = using)
  exec("""
    INSERT INTO testtabu (c1)
    VALUES (:var_2)
    """, using = using)
  exec("""
    INSERT INTO testtabu (c1)
    VALUES (:var_3)
    """, using = using)
  exec("""
    UPDATE testtabu
      SET
        c2 = 'X'
      WHERE
        c1 = :var_1
    """, using = using)
  exec("""
    UPDATE testtabu
      SET
        c2 = 'Y'
      WHERE
        c1 = :var_2
    """, using = using)
  exec("""
    UPDATE testtabu
      SET
        c2 = 'Z'
      WHERE
        c1 = :var_3
    """, using = using)
  snowconvert.helpers.quit_application()

if __name__ == "__main__":
  main()
Copy
Ergebnis
ROWC1C2
1AX
2BY
3CZ

Bekannte Probleme

1. Der Befehl .REPEAT wird noch nicht unterstützt

Der Befehl .REPEAT wird noch nicht unterstützt. Das bedeutet, dass USING REQUEST MODIFIER nur die Daten verwendet, die aus der ersten Zeile der Eingabedatei geladen werden. Die Abfragen werden also nur einmal ausgeführt.

Dieses Problem sollte behoben werden, wenn der Befehl .REPEAT eine angemessene Unterstützung für die Transformation erhält.

Wenn Sie weitere Fragen zu dieser Dokumentation haben, können Sie uns eine E-Mail an snowconvert-support@snowflake.com senden.

Zugehörige EWIs

Keine zugehörigen EWIs.