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(): |
|
.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;
上の例では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()。
クエリステートメントの実行¶
BTEQ ファイル内のすべての SQL ステートメントは、[snowconvert.helpers](snowconvert-script-helpers)が提供する exec 関数を通じて実行されます。たとえば、次のようなコードです。
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 結果¶
| C1 | C2 |
|---|---|
| A | X |
| D | X |
| G | X |
| B | Y |
| E | Y |
| H | Y |
| C | Z |
| F | Z |
| I | Z |
| ? | _ |
| ? | _ |
| ? | _ |
| * | null |
| [ | null |
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:¶
クエリ¶
#*** 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 結果¶
| C1 | C2 |
|---|---|
| A | X |
| D | X |
| G | X |
| B | Y |
| E | Y |
| H | Y |
| C | Z |
| F | Z |
| I | Z |
| ? | _ |
| ? | _ |
| ? | _ |
| * | null |
| [ | null |
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 |
既知の問題¶
問題は見つかりませんでした。
関連 EWIs ¶
関連 EWIs はありません。
USING REQUEST MODIFIER¶
USING REQUEST MODIFIER クエリの変換仕様。
注釈
わかりやすくするため、出力コードの一部を省略しています。
Teradataの ドキュメント にあるように、 USING REQUEST MODIFIER は、その後の SELECT、 INSERT、 UPDATE、または 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 ステートメントが必要です。
したがって、このステートメントの変換は以下のステップに従います。
SnowConvert AI ヘルパーから
import_file()関数を呼び出します。これでデータは一時ファイルにロードされます。SnowConvert AI ヘルパーから
using()関数を呼び出して、ロードされたデータでディクショナリを作成します。クエリごとに、 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;
結果¶
| ROW | C1 | C2 |
|---|---|---|
| 1 | A | X |
| 2 | B | Y |
| 3 | C | Z |
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()
結果¶
| ROW | C1 | C2 |
|---|---|---|
| 1 | A | X |
| 2 | B | Y |
| 3 | C | Z |
既知の問題¶
1. .REPEAT コマンドはまだサポートされていません
.REPEAT コマンドはまだサポートされていません。つまり、 USING REQUEST MODIFIER は入力ファイルの最初の行からロードされたデータのみを使用します。したがって、クエリは一度しか実行されません。
この問題は、.REPEAT コマンドが適切な変換サポートを受けると修正されるはずです。
この文書に関してご質問がある場合は、[snowconvert-support@snowflake.com](mailto:snowconvert-support@snowflake.com)まで電子メールをお送りください。
関連 EWIs ¶
関連 EWIs はありません。