SnowConvert AI - Teradata - BTEQ¶
Références de traduction pour convertir des fichiers Teradata BTEQ en Python
Basic Teradata Query (BTEQ) est un programme général à base de commandes qui permet aux utilisateurs d’une station de travail de communiquer avec un ou plusieurs systèmes de bases de données Teradata et de formater des rapports pour une sortie sur papier ou à l’écran.
Afin de simuler la fonctionnalité BTEQ pour Teradata dans Snowflake, les fichiers et les commandes BTEQ sont transformés en code Python, de manière similaire aux transformations effectuées pour les scripts MultiLoad et FastLoad. Le code généré utilise le projet Snowflake Python appelé snowconvert.helpers qui contient les fonctions requises pour simuler les instructions de BTEQ dans Snowflake.
Traduction des commandes BTEQ¶
La table suivante présente la conversion des commandes BTEQ vers Snowflake.
Teradata |
Snowflake |
Remarques |
|---|---|---|
ERRORCODE != 0 |
snowconvert.helpers.error_code != 0 |
|
.EXPORT DATA FILE=fileName |
Export.report(« fileName », « , ») |
La fonction n’a pas de fonctionnalité |
.EXPORT INDICDATA FILE=fileName |
Export.report(« fileName », « , ») |
La fonction n’a pas de fonctionnalité |
.EXPORT REPORT FILE=fileName |
Export.report(« fileName », « , ») |
La fonction n’a pas de fonctionnalité |
.EXPORT DIF FILE=fileName |
Export.report(« fileName », « , ») |
La fonction n’a pas de fonctionnalité |
.EXPORT RESET |
Export.reset() |
La fonction n’a pas de fonctionnalité |
.IF ERRORCODE != 0 THEN .QUIT ERRORCODE |
If snowconvert.helpers.error_code != 0: snowconvert.helpers.quit_application (snowconvert.helpers.error_code) |
|
.IMPORT RESET |
snowconvert.helpers.import_reset() |
La fonction n’a pas de fonctionnalité |
.LABEL newLabel |
def NEWLABEL(): |
|
.LOGOFF |
L’instruction est commentée |
|
.LOGON |
L’instruction est commentée |
|
.LOGMECH |
L’instruction est commentée |
|
.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() |
La fonction n’a pas de fonctionnalité |
.SET ERRORLEVEL 3807 SEVERITY 0 |
snowconvert.helpers.set_error_level(3807, 0) |
|
.SET RECORMODE OFF |
Export.record_mode(False) |
|
.SET RECORMODE ON |
Export.record_mode(True) |
|
.SET SEPARATOR “|” |
Export.separator_string(“|”) |
La fonction n’a pas de fonctionnalité |
.SET WIDTH 120 |
Export.width(120) |
La fonction n’a pas de fonctionnalité |
.Remark « « Hello world! » » » |
snowconvert.helpers.remark(r » » » » » »Hello world! » » » » » ») |
|
.QUIT ERRORCODE |
snowconvert.helpers.quit_application( snowconvert.helpers.error_code ) |
|
.QUIT |
snowconvert.helpers.quit_application() |
|
Instructions SQL |
exec(statement) |
|
$(<$INPUT_SQL_FILE) |
exec_file(« $INPUT_SQL_FILE ») |
|
= (Repeat previous command) |
snowconvert.helpers.repeat_previous_sql_statement(con) |
Pour les instructions plus compliquées présentées dans la table précédente, des sous-sections avec des exemples plus élaborés sont expliquées.
Conversion en valeur .GOTO¶
Étant donné que nous convertissons les scripts BTEQ en Python, certaines structures valables dans BTEQ ne sont pas intrinsèquement prises en charge dans Python. C’est le cas de la commande .GOTO utilisant les commandes . Label.
C’est pourquoi une alternative a été développée afin d’émuler la fonctionnalité de ces commandes, en transformant les commandes . Label en fonctions avec des instructions d’appel ultérieures.
Regardez le code suivant :
.LABEL FIRSTLABEL
SELECT * FROM MyTable1;
.LABEL SECONDLABEL
SELECT * FROM MyTable2;
SELECT * FROM MyTable3;
Dans l’exemple ci-dessus, il y avait cinq commandes. Deux d’entre elles étaient des commandes. Label. La commandeFIRSTLABELa été transformée en une fonction avec la ou les instructions qui la suivent ci-dessous jusqu’à ce qu’une autre commande.LABELsoit trouvée. Lorsqu’une autre étiquette est appelée (dans le cas présent, SECONDLABEL), cet appel met fin à la première fonction et en démarre une nouvelle.
Si nous devions migrer l’exemple précédent, le résultat serait le suivant :
#*** 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()
Notez qu’il y a un appel à la fonctionFIRSTLABEL, cette fonction n’a qu’une seule instruction, qui serait la seule commande sans étiquette qui suitFIRSTLABELdans le code d’origine. Avant que la fonction FIRSTLABELse termine, elle appelle SECONDLABEL, avec les instructions qui la suivent.
Remarques
Création d’une variable connecteur
con = None, et alimentation de cette variable dans la fonctionmain():con = snowconvert.helpers.log_on().Définition d’un journal :
snowconvert.helpers.configure_log().
Exécution des instructions de requête¶
Chaque instruction SQL trouvée dans un fichier BTEQ sera exécutée via la fonctionexecfournie par snowconvert.helpers. Prenons l’exemple du code suivant :
CREATE TABLE aTable (aColumn BYTEINT);
Il est converti en :
#*** 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()
Exécution des fichiers de script¶
Les fichiers contenant les commandes BTEQ et les instructions Teradata SQL d’un utilisateur sont appelés scripts, fichiers d’exécution, macros ou procédures stockées. Par exemple, créez un fichier appelé SAMPFILE, et entrez le script BTEQ suivant :
.LOGON tdpid/userid,password
SELECT * FROM department;
.LOGOFF
Pour exécuter le fichier d’exécution, entrez l’une ou l’autre forme de la commande BTEQ RUN :
.RUN FILE=sampfile
Si vous convertissez le deuxième code, le résultat est le suivant :
#*** 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()
L’instruction snowconvert.helpers.readrun("sampfile") renverra chaque ligne de l’instruction SAMPFILE et dans l’instructionFOR, chacune des lignes sera transmise à la fonction eval, une fonction qui analyse l’expression qui lui est transmise et exécute l’expression Python (l’instruction SAMPFILE doit être convertie en travail) au sein du programme.
Exécuter les fichiers SQL¶
Dans certaines instances, lors de l’exécution d’un fichier BTEQ, un fichier SQL peut être trouvé, par exemple le fichier SQL appelé NEWSQL :
CREATE TABLE aTable (aColumn BYTEINT);
Ceci peut être exécuté au cours d’un script avec la ligne suivante :
$(<$NEWSQL)
Après la conversion du script, le résultat est le suivant :
#*** 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()
La fonction d’assistance exec_file lira chaque ligne du fichier NEWSQL et utilisera ensuite la fonction exec comme expliqué dans la section Exécution des instructions de requête.
Problèmes connus ¶
Aucun problème n’a été constaté.
REPEAT¶
Spécification de traduction pour l’instruction REPEAT.
Note
Certaines parties du code de sortie sont omises pour des raisons de clarté.
Selon la documentation Teradata, l’instruction REPEAT permet aux utilisateurs de spécifier le nombre maximum de fois que la prochaine requête SQL doit être soumise. Notez qu’une requête SQL peut être une requête à une ou plusieurs instructions. Ce mécanisme est défini par la position des points-virgules pour chaque instruction suivant l’instruction REPEAT.
Syntaxe¶
REPEAT [ n [ PACK p [ REQBUFLEN b ] ] | * | RECS r]
<sql_request>
Modèles d’échantillons de sources¶
Avec ces données d’entrée :
inputData.dat¶
A B C
D E F
G H I
inputData2.dat¶
* [
] *
Teradata :¶
Requête¶
.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);
Résultat TESTTABU¶
| C1 | C2 |
|---|---|
| A | X |
| D | X |
| G | X |
| B | Y |
| E | Y |
| H | Y |
| C | Z |
| F | Z |
| I | Z |
| ? | _ |
| ? | _ |
| ? | _ |
| * | null |
| [ | null |
Résultat TESTTABU2¶
| 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 :¶
Requête¶
#*** 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()
Résultat TESTTABU¶
| C1 | C2 |
|---|---|
| A | X |
| D | X |
| G | X |
| B | Y |
| E | Y |
| H | Y |
| C | Z |
| F | Z |
| I | Z |
| ? | _ |
| ? | _ |
| ? | _ |
| * | null |
| [ | null |
Résultat TESTTABU2¶
| 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 |
Problèmes connus ¶
Aucun problème n’a été constaté.
EWIs connexes ¶
Pas d’EWIs connexes.
USING REQUEST MODIFIER¶
Spécification de traduction pour la requête USING REQUEST MODIFIER.
Note
Certaines parties du code de sortie sont omises pour des raisons de clarté.
Conformément à la documentation Teradata, l’instruction USING REQUEST MODIFIER définit un ou plusieurs noms de paramètres variables à utiliser dans les instructions suivantes SELECT, INSERT, UPDATE ou DELETE pour importer ou exporter des données.
La syntaxe de cette instruction est la suivante :
USING ( <using_spec> [,...] ) SQL_request
<using_spec> ::= using_variable_name data_type [ data_type_attribute [...] ]
[ AS { DEFERRED [BY NAME] | LOCATOR } ]
Comme indiqué dans la documentation de Teradata, USING REQUEST MODIFIER doit être précédé d’une instruction .IMPORT pour charger les données dans les paramètres définis.
Ainsi, la transformation de cette instruction suit les étapes suivantes :
Appelez la fonction
import_file()des commandes d’assistance SnowConvert AI. Cette opération charge les données dans un fichier temporaire.Appelez la fonction `` des commandes d’assistance SnowConvert AI pour créer un dictionnaire avec les données chargées.
Pour chaque requête, exécutez la fonction
exec()des commandes d’assistance SnowConvert AI et transmettez le dictionnaire précédemment défini. Pour ce faire, les capacités de liaison de données du connecteur Python de Snowflake seront utilisées.
Avec ces données d’entrée :
A,B,C
Teradata (MultiLoad)
Requête¶
.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;
Résultat¶
| ROW | C1 | C2 |
|---|---|---|
| 1 | A | X |
| 2 | B | Y |
| 3 | C | Z |
Snowflake (Python)
Requête¶
#*** 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()
Résultat¶
| ROW | C1 | C2 |
|---|---|---|
| 1 | A | X |
| 2 | B | Y |
| 3 | C | Z |
Problèmes connus¶
1. La commande .REPEAT n’est pas encore prise en charge
La commande .REPEAT n’est pas encore prise en charge. Cela signifie que USING REQUEST MODIFIER n’utilisera que les données chargées à partir de la première ligne du fichier d’entrée. Ainsi, les requêtes ne seront exécutées qu’une seule fois.
Ce problème devrait être corrigé lorsque la commande .REPEAT bénéficiera de la prise en charge adéquate des transformations.
Si vous avez d’autres questions concernant cette documentation, vous pouvez nous envoyer un e-mail à snowconvert-support@snowflake.com.
EWIs connexes ¶
Pas d’EWIs connexes.