SnowConvert AI - Teradata - BTEQ

Teradata BTEQ ファイルをPythonに変換するための翻訳リファレンス

Basic Teradata Query(BTEQ)は、ワークステーションのユーザーが1つまたは複数のTeradataデータベースシステムと通信し、印刷と画面出力の両方でレポートを形式化できるようにする、コマンドベースの汎用プログラムです。

To simulate the BTEQ functionality for Teradata in Snowflake, BTEQ files and commands are transformed to Python code, similar to the transformations performed for MultiLoad and FastLoad scripts. The generated code uses the Snowflake Python project called snowconvert.helpers which contains the required functions to simulate the BTEQ statements in Snowflake.

BTEQ コマンド翻訳

次のテーブルは、 BTEQ コマンドのSnowflakeへの変換を示します。

Teradata

Snowflake

メモ

ERRORCODE != 0

snowconvert.helpers.error_code != 0

.EXPORT DATA FILE=fileName

Export.report("fileName", ",")

関数に機能はありません

.EXPORT INDICDATA FILE=fileName

Export.report("fileName", ",")

関数に機能はありません

.EXPORT REPORT FILE=fileName

Export.report("fileName", ",")

関数に機能はありません

.EXPORT DIF FILE=fileName

Export.report("fileName", ",")

関数に機能はありません

.EXPORT RESET

Export.reset()

関数に機能はありません

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

関数に機能はありません

.LABEL newLabel

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

.LOGOFF

ステートメントはコメントされています

.LOGON

ステートメントはコメントされています

.LOGMECH

ステートメントはコメントされています

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

関数に機能はありません

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

.SET SEPARATOR '|'

Export.separator_string('|')

関数に機能はありません

.SETWIDTH 120

Export.width(120)

関数に機能はありません

.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 ステートメント

exec(statement)

$(<$INPUT_SQL_FILE)

exec_file("$INPUT_SQL_FILE")

= (前のコマンドを繰り返す)

snowconvert.helpers.repeat_previous_sql_statement(con)

For more complicated statements presented in the previous table, subsections with detailed examples are provided below.

.GOTO 変換

私たちは BTEQ スクリプトをPythonに変換しているので、 BTEQ で有効なある種の構造はPythonでは本質的にサポートされていません。これは、 .Label コマンドを使用する .GOTO コマンドのケースです。

このため、これらのコマンドの機能をエミュレートできるように、 .Label コマンドを、後続のコールステートメントを持つ関数に変換する代替手段が開発されました。

以下のコードを確認してください。

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

上の例では5つのコマンドがありました。そのうちの2つは .Label コマンドでした。コマンド FIRSTLABEL は、別の .LABEL コマンドが見つかるまで、その下のステートメントを含む関数に変換されました。別のラベルが呼ばれると(このケースでは SECONDLABEL)、最初の関数が終了し、新しい関数が開始されます。

先ほどの例を移行すると、結果はこうなります。

 #*** 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()

関数 FIRSTLABEL_ の呼び出しがあることに注意してください。この関数にはステートメントが1つしかなく、それは元のコード内で FIRSTLABEL に続く唯一のラベル以外のコマンドになります。関数が終了する前に、 _ FIRSTLABEL はそれに続くステートメントを使用して SECONDLABEL を呼び出します。_

  • 注意:

    • コネクタ変数 con = None を作成し、 main() 関数でその変数に入力します: con = snowconvert.helpers.log_on()

    • ログのセットアップ: snowconvert.helpers.configure_log()

クエリステートメントの実行

Every SQL statement found in a BTEQ file will be executed through theexecfunction provided by the snowconvert.helpers. Take for example the following code:

 CREATE TABLE aTable (aColumn BYTEINT);

これは次のように変換されます。

 #*** 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()

スクリプトファイルの実行

ユーザーの BTEQ コマンドとTeradata SQL ステートメントを含むファイルは、スクリプト、実行ファイル、マクロ、またはストアドプロシージャと呼ばれます。例えば、 SAMPFILE というファイルを作成し、以下の BTEQ スクリプトを入力します。

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

実行ファイルを実行するには、 BTEQ RUN コマンドのいずれかの形式を入力します。

.RUN FILE=sampfile

2番目のコードを変換すると、結果は次のようになります。

 #*** 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") は SAMPFILE から各行を返し、FOR ステートメントでは、各行が eval 関数に渡されます。これは渡された式を解析し、プログラム内でPython式を実行するメソッドです(SAMPFILE は動作するように変換する必要があります)。

SQL ファイルの実行

BTEQ ファイルの実行中に、 SQL ファイルが見つかることがあります。例えば、 NEWSQL という SQL ファイルがあるとします。

 CREATE TABLE aTable (aColumn BYTEINT);

これはスクリプト中に以下の行で実行できます。

 $(<$NEWSQL)

そして、スクリプトの変換後の結果は次のとおりです。

 #*** 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()

exec_file ヘルパー関数は NEWSQL ファイルから各行を読み込み、セクション クエリステートメントの実行で説明されているようにexec関数を使用します。

既知の問題

問題は見つかりませんでした。

REPEAT

REPEAT ステートメントの変換仕様。

注釈

わかりやすくするため、出力コードの一部を省略しています。

Teradataの ドキュメント によると、 REPEAT ステートメントにより、ユーザーは次の SQL リクエストの最大提出回数を指定できます。SQL リクエストは単一または複数ステートメントのリクエストになる可能性があることに注意してください。これは、 REPEAT ステートメントに続く各ステートメントのセミコロンの位置によって定義されます。

構文

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

サンプルソースパターン

この入力データで:

inputData.dat

A B C
D E F
G H I

inputData2.dat
* [
] *

Teradata:

クエリ
 .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 結果
C1C2
AX
DX
GX
BY
EY
HY
CZ
FZ
IZ
?_
?_
?_
*null
[null
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:

クエリ
 #*** 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 結果
C1C2
AX
DX
GX
BY
EY
HY
CZ
FZ
IZ
?_
?_
?_
*null
[null
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

既知の問題

問題は見つかりませんでした。

関連 EWIs

関連 EWIs はありません。

USING REQUEST MODIFIER

USING REQUEST MODIFIER クエリの変換仕様。

注釈

わかりやすくするため、出力コードの一部を省略しています。

Teradataの ドキュメント にあるように、 USING REQUEST MODIFIER は、その後の SELECTINSERTUPDATE、または DELETE ステートメントで使用される1つ以上の変数パラメーター名を定義し、データをインポートまたはエクスポートします。

このステートメントの構文は以下の通りです。

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

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

Teradataのドキュメントに記載されているように、定義されたパラメーターにデータをロードするには、 USING REQUEST MODIFIER の前に.IMPORT ステートメントが必要です。

したがって、このステートメントの変換は以下のステップに従います。

  1. SnowConvert AI ヘルパーから import_file() 関数を呼び出します。これでデータは一時ファイルにロードされます。

  2. SnowConvert AI ヘルパーから using() 関数を呼び出して、ロードされたデータでディクショナリを作成します。

  3. クエリごとに、 SnowConvert AI ヘルパーから exec() 関数を実行し、以前に定義したディクショナリを渡します。これにより、Snowflake Pythonコネクタのデータバインディング機能が使用されます。

この入力データで:

 A,B,C

Teradata(MultiLoad)

クエリ

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

結果

ROWC1C2
1AX
2BY
3CZ

Snowflake(Python)

クエリ
 #*** 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()
結果
ROWC1C2
1AX
2BY
3CZ

既知の問題

1. .REPEAT コマンドはまだサポートされていません

.REPEAT コマンドはまだサポートされていません。つまり、 USING REQUEST MODIFIER は入力ファイルの最初の行からロードされたデータのみを使用します。したがって、クエリは一度しか実行されません。

この問題は、.REPEAT コマンドが適切な変換サポートを受けると修正されるはずです。

この文書に関してご質問がある場合は、[snowconvert-support@snowflake.com](mailto:snowconvert-support@snowflake.com)まで電子メールをお送りください。

関連 EWIs

関連 EWIs はありません。