SnowConvert AI - Teradata - BTEQ¶
Teradata BTEQ파일을 Python으로 변환하기 위한 변환 참조
기본 Teradata 쿼리(BTEQ)는 워크스테이션의 사용자가 1개 이상의 Teradata 데이터베이스 시스템과 통신하고 인쇄 및 화면 출력용 보고서 형식을 지정할 수 있는 범용 명령 기반 프로그램입니다.
Snowflake에서 Teradata의 BTEQ 기능을 시뮬레이션하기 위해 BTEQ 파일과 명령은 MultiLoad 및 FastLoad 스크립트에 대해 수행된 변환과 유사하게 Python 코드로 변환됩니다. 생성된 코드는 Snowflake의 BTEQ 문을 시뮬레이션하는 데 필요한 함수가 포함된 snowconvert.helpers라는 Snowflake Python 프로젝트를 사용합니다.
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 |
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() |
이 함수에는 기능이 없습니다 |
.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(‘|’) |
이 함수에는 기능이 없습니다 |
.SET WIDTH 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 함수에 대한 호출이 있음에 유의합니다. 이 함수에는 문이 하나이며, 이는 원본 코드의 FIRSTLABEL 뒤에 오는 유일한 비 레이블 명령입니다. FIRSTLABEL 함수가 종료되기 전에, SECONDLABEL을 호출하며, 그 뒤에 문이 옵니다.
참고:
커넥터 변수
con = None을 생성하고main()함수:con = snowconvert.helpers.log_on()에 채웁니다.로그 설정:
snowconvert.helpers.configure_log().
쿼리 문 실행하기¶
BTEQ 파일에서 발견된 모든 SQL 문은 snowconvert.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
두 번째 코드를 변환하면 결과는 다음과 같습니다.
#*** 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 문에서 각 라인은 전달된 식을 구문 분석하여 프로그램 내에서 Python 식(SAMPFILE 이 작동하도록 변환되어야 함)을 실행하는 함수인 eval 함수로 전달됩니다.
SQL 파일 실행¶
BTEQ 파일을 실행하는 동안 SQL 파일을 찾을 수 있는 인스턴스도 있습니다. 예를 들어, SQL 파일을 NEWSQL 이라고 합니다.
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 파일에서 각 라인을 읽은 다음 쿼리문 실행하기 섹션에 설명된 대로 실행 함수를 사용합니다.
알려진 문제 ¶
문제가 발견되지 않았습니다.
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 문에서 사용할 하나 이상의 매개 변수 이름을 정의합니다.
이 문의 구문은 다음과 같습니다.
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 Connector 데이터 바인딩 기능을 사용합니다.
이 입력 데이터로:
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 |
Known Issues¶
1. REPEAT 명령은 아직 지원되지 않습니다
.REPEAT 명령은 아직 지원되지 않습니다. 즉, USING REQUEST MODIFIER 는 입력 파일의 첫 번째 행에서 로딩된 데이터만 사용합니다. 따라서 쿼리는 한 번만 실행됩니다.
이 문제는 .REPEAT 명령이 적절한 변환 지원을 받으면 수정될 것입니다.
이 설명서와 관련하여 추가 질문이 있는 경우 snowconvert-support@snowflake.com으로 이메일을 보내주세요.
관련 EWIs ¶
관련 EWIs 없음.