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

이 함수에는 기능이 없습니다

.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;
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 함수에 대한 호출이 있음에 유의합니다. 이 함수에는 문이 하나이며, 이는 원본 코드의 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);
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

두 번째 코드를 변환하면 결과는 다음과 같습니다.

 #*** 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 문에서 각 라인은 전달된 식을 구문 분석하여 프로그램 내에서 Python 식(SAMPFILE 이 작동하도록 변환되어야 함)을 실행하는 함수인 eval 함수로 전달됩니다.

SQL 파일 실행

BTEQ 파일을 실행하는 동안 SQL 파일을 찾을 수 있는 인스턴스도 있습니다. 예를 들어, SQL 파일을 NEWSQL 이라고 합니다.

 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 파일에서 각 라인을 읽은 다음 쿼리문 실행하기 섹션에 설명된 대로 실행 함수를 사용합니다.

알려진 문제

문제가 발견되지 않았습니다.

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 는 데이터를 가져오거나 내보내기 위해 후속 SELECT, INSERT, UPDATE 또는 DELETE 문에서 사용할 하나 이상의 매개 변수 이름을 정의합니다.

이 문의 구문은 다음과 같습니다.

 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 Connector 데이터 바인딩 기능을 사용합니다.

이 입력 데이터로:

 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

Known Issues

1. REPEAT 명령은 아직 지원되지 않습니다

.REPEAT 명령은 아직 지원되지 않습니다. 즉, USING REQUEST MODIFIER 는 입력 파일의 첫 번째 행에서 로딩된 데이터만 사용합니다. 따라서 쿼리는 한 번만 실행됩니다.

이 문제는 .REPEAT 명령이 적절한 변환 지원을 받으면 수정될 것입니다.

이 설명서와 관련하여 추가 질문이 있는 경우 snowconvert-support@snowflake.com으로 이메일을 보내주세요.

관련 EWIs

관련 EWIs 없음.