SnowConvert AI - Teradata - BTEQ

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

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

SnowflakeでTeradataの BTEQ 機能をシミュレートするために、 MultiLoad、FastLoad スクリプトの変換と同様に、 BTEQ ファイルとコマンドをPythonコードに変換します。生成されたコードは、[snowconvert.helpers](snowconvert-script-helpers)と呼ばれるSnowflake Pythonプロジェクトを使用しています。このプロジェクトには、Snowflakeの BTEQ ステートメントをシミュレートするために必要な機能が含まれています。

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)

前のテーブルで示したステートメントのうち、より複雑なものについては、より詳細な例を示したサブセクションで説明しています。

.GOTO 変換

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

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

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

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

上の例では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()
Copy

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

  • 注意:

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

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

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

BTEQ ファイル内のすべての SQL ステートメントは、[snowconvert.helpers](snowconvert-script-helpers)が提供する exec 関数を通じて実行されます。たとえば、次のようなコードです。

 CREATE TABLE aTable (aColumn BYTEINT);
Copy

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

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

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

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

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

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

.RUN FILE=sampfile

Copy

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

snowconvert.helpers.readrun("sampfile") は SAMPFILE から各行を返し、FOR ステートメントでは、各行が eval 関数に渡されます。これは渡された式を解析し、プログラム内でPython式を実行するメソッドです(SAMPFILE は動作するように変換する必要があります)。

SQL ファイルの実行

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

 CREATE TABLE aTable (aColumn BYTEINT);
Copy

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

 $(<$NEWSQL)
Copy

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

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

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

既知の問題

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

REPEAT

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

注釈

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

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

構文

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

Copy

サンプルソースパターン

この入力データで:

inputData.dat

A B C
D E F
G H I

Copy
inputData2.dat
* [
] *

Copy

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);
Copy
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()
Copy
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 } ]
Copy

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

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

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

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

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

この入力データで:

 A,B,C
Copy

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

結果

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()
Copy
結果
ROWC1C2
1AX
2BY
3CZ

既知の問題

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

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

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

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

関連 EWIs

関連 EWIs はありません。