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(): |
|
.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;
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()
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 Funktionmain():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);
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()
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
Um die Ausführungsdatei auszuführen, geben Sie eine der beiden Formen des Befehls BTEQ RUN ein:
.RUN FILE=sampfile
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()
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);
Dies kann während eines Skripts mit der folgenden Zeile ausgeführt werden:
$(<$NEWSQL)
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()
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>
Beispielhafte Quellcode-Muster¶
Mit diesen Eingabedaten:
inputData.dat¶
A B C
D E F
G H I
inputData2.dat¶
* [
] *
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);
TESTTABU-Ergebnis¶
| C1 | C2 |
|---|---|
| A | X |
| D | X |
| G | X |
| B | Y |
| E | Y |
| H | Y |
| C | Z |
| F | Z |
| I | Z |
| ? | _ |
| ? | _ |
| ? | _ |
| * | null |
| [ | null |
TESTTABU2-Ergebnis¶
| MY_NAME | MY_AGE |
|---|---|
| John Doe | 23 |
| John Doe | 23 |
| John Doe | 23 |
| John Doe | 23 |
| John Doe | 23 |
| John Doe | 23 |
| John Doe | 23 |
| John Doe | 23 |
| John Doe | 23 |
| John Doe | 23 |
| Bob Alice | 21 |
| Bob Alice | 21 |
| Bob Alice | 21 |
| Bob Alice | 21 |
| Bob Alice | 21 |
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()
TESTTABU-Ergebnis¶
| C1 | C2 |
|---|---|
| A | X |
| D | X |
| G | X |
| B | Y |
| E | Y |
| H | Y |
| C | Z |
| F | Z |
| I | Z |
| ? | _ |
| ? | _ |
| ? | _ |
| * | null |
| [ | null |
TESTTABU2-Ergebnis¶
| MY_NAME | MY_AGE |
|---|---|
| John Doe | 23 |
| John Doe | 23 |
| John Doe | 23 |
| John Doe | 23 |
| John Doe | 23 |
| John Doe | 23 |
| John Doe | 23 |
| John Doe | 23 |
| John Doe | 23 |
| John Doe | 23 |
| Bob Alice | 21 |
| Bob Alice | 21 |
| Bob Alice | 21 |
| Bob Alice | 21 |
| Bob Alice | 21 |
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 } ]
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:
Rufen Sie die
import_file()-Funktion über die SnowConvert AI-Hilfsfunktionen auf. Dadurch werden die Daten in eine temporäre Datei geladen.Rufen Sie die
using()-Funktion über die SnowConvert AI-Hilfsfunktionen auf, um ein Wörterbuch mit den geladenen Daten zu erstellen.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
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;
Ergebnis¶
| ROW | C1 | C2 |
|---|---|---|
| 1 | A | X |
| 2 | B | Y |
| 3 | C | Z |
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()
Ergebnis¶
| ROW | C1 | C2 |
|---|---|---|
| 1 | A | X |
| 2 | B | Y |
| 3 | C | Z |
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.