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():
snowconvert.helpers.quit_application()

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

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()
Copy

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 fonction main(): 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);
Copy

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()
Copy

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
Copy

Pour exécuter le fichier d’exécution, entrez l’une ou l’autre forme de la commande BTEQ RUN :

.RUN FILE=sampfile

Copy

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()
Copy

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);
Copy

Ceci peut être exécuté au cours d’un script avec la ligne suivante :

 $(<$NEWSQL)
Copy

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()
Copy

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>

Copy

Modèles d’échantillons de sources

Avec ces données d’entrée :

inputData.dat

A B C
D E F
G H I

Copy
inputData2.dat
* [
] *

Copy

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);
Copy
Résultat TESTTABU
C1C2
AX
DX
GX
BY
EY
HY
CZ
FZ
IZ
?_
?_
?_
*null
[null
Résultat TESTTABU2
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 :

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()
Copy
Résultat TESTTABU
C1C2
AX
DX
GX
BY
EY
HY
CZ
FZ
IZ
?_
?_
?_
*null
[null
Résultat TESTTABU2
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

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 } ]
Copy

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 :

  1. Appelez la fonction import_file() des commandes d’assistance SnowConvert AI. Cette opération charge les données dans un fichier temporaire.

  2. Appelez la fonction `` des commandes d’assistance SnowConvert AI pour créer un dictionnaire avec les données chargées.

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

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;
Copy

Résultat

ROWC1C2
1AX
2BY
3CZ

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()
Copy
Résultat
ROWC1C2
1AX
2BY
3CZ

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.