【TERADATA】BTEQを使用したバッチ処理の作成方法

### 1.目的
BTEQとはTERADATAデータベースに接続するためのコマンドラインツールです。
利用方法としてはユーザーが対話的にコマンドを実行する対話モードと、スクリプトを実行するバッチモードが存在します。
今回はバッチモードを使用して、あらかじめ決められた処理を実行する方法を紹介します。
<br>
・実行環境
Teradata Vantage Express 17.20
以下のサイト（TERADATA DOWNLOAD）よりダウンロードできます。
https://downloads.teradata.com/download/database/teradata-express/vmware
<br>

### 2.BTEQスクリプトファイルの実行方法
①テキストエディタを起動してBTEQスクリプトファイルを作成します。
```
VantageExpress1720-Sles12:/tmp/bteq # vi sample_script.txt
```
②スクリプトファイルをリダイレクトしてbteqコマンドを実行します。
```
VantageExpress1720-Sles12:/tmp/bteq # bteq < sample_script.txt
```


Linuxシェルスクリプトの内部にヒアドキュメントを使用してBTEQのコマンドを埋め込むこともできます。
```
#!/bin/bash
bteq << EOF
/*BTEQスクリプト本文*/
EOF
```
<br>


### 3.BTEQスクリプトファイルの構文
以下、BTEQのコマンドを一部紹介します。

①.LOGON
データベースにログオンするためのコマンドです。
SQLを実行する前に、まずTERADATAデータベースにログオンしましょう。
```
.LOGON tdpid/username,userpassword
```
tdpidでDBサーバーのIPアドレス（ホスト名）を指定します。
username、userpasswordはログオンユーザー名、パスワードを指定してください。<br><br>

②.SET SESSION CHARSET
セッション文字コードを指定するコマンドです。
```
.SET SESSION CHARSET '文字コード'
```

セッション文字コードはBTEQの起動時に-cオプションで指定することもできます。
```
VantageExpress1720-Sles12:/tmp/bteq # bteq -c UTF8
```
<br>

③.SET WIDTH
バッチモードでは、デフォルトの出力幅は各行254文字までです。そのため、255文字目以降のSQL結果は表示されません。
出力幅を変更したい場合は、.SET WIDTHコマンドを使用して、任意の出力文字数を指定できます。（n=出力文字数）
```
.SET WIDTH n
```
<br>

④.EXPORT REPORT FILE
SQL結果をファイルに出力する際、指定します。
```
.EXPORT REPORT FILE 出力ファイル名
```
<br>

⑤SQL文
任意のSQL文を記載してください。
.RUN FILEを指定することで、SQLが記載されたファイルを実行することもできます。
```
.RUN FILE ファイル名
```
<br>

⑥IF文
BTEQではIF文を使用することもできます。
以下の例ではemployee_tblの件数が0件の場合に、COUNT_0というラベル付けされた処理に移動し、そうでない場合はNOT_COUNT_0に移動します。
```
SELECT * FROM employee_tbl;
.IF ACTIVITYCOUNT = 0 THEN .GOTO COUNT_0
.GOTO NOT_COUNT_0

.LABEL COUNT_0
UPDATE admin_tbl set tbl_cnt = 0 where tablename = 'employee_tbl';
.QUIT

.LABEL NOT_COUNT_0
.QUIT
```
IF文はエラーの検出にも使用できます。
```
SELECT * FROM employee_tbl;
.IF ERRORCODE != 0 THEN QUIT 12
```
<br>

⑦QUIT(EXIT)
セッションを切断し、BTEQから退出するコマンドです。
後ろに任意の数字をつけることでリターンコードを指定できます。

```
.QUIT 0
```

<br>

### 4.BTEQスクリプト実行例

・BTEQスクリプト
```
.LOGON DBC/demo_user,demo_user
.SET SESSION CHARSET 'UTF8'
.SET WIDTH 1000
.EXPORT REPORT FILE report_number_01.txt

SELECT * FROM demo_user.employee_tbl;
.IF ERRORCODE != 0 THEN QUIT 12

.EXPORT RESET
/*出力条件のリセット*/

.RUN FILE = sample_SQL.txt

.EXPORT REPORT FILE report_number_02.txt
SELECT * FROM demo_user.employee_task_tbl;
.IF ERRORCODE != 0 THEN QUIT 12

.IF ACTIVITYCOUNT = 0 THEN .GOTO COUNT_0
.GOTO NOT_COUNT_0

.LABEL COUNT_0
UPDATE demo_user.employee_tbl set employee_task = null;
.IF ERRORCODE != 0 THEN QUIT 12
.QUIT

.LABEL NOT_COUNT_0
.QUIT
```


・sample_SQL.txtの中身
```
sel * from dbc.dbcinfoV;
sel date,time;
```


・結果

```
+---------+---------+---------+---------+---------+---------+---------+----
.LOGON DBC/demo_user,

 *** Logon successfully completed.
 *** Teradata Database Release is 17.20.03.09
 *** Teradata Database Version is 17.20.03.09
 *** Transaction Semantics are BTET.
 *** Session Character Set Name is 'ASCII'.

 *** Total elapsed time was 1 second.

+---------+---------+---------+---------+---------+---------+---------+----
.SET SESSION CHARSET 'UTF8'
+---------+---------+---------+---------+---------+---------+---------+----
.SET WIDTH 1000
+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+-
.EXPORT REPORT FILE report_number_01.txt
 *** To reset export, type .EXPORT RESET
+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+-

SELECT * FROM demo_user.employee_tbl;

 *** Query completed. 150 rows found. 6 columns returned.
 *** Total elapsed time was 1 second.


+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+-
.IF ERRORCODE != 0 THEN QUIT 12
+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+-

.EXPORT RESET
 *** Output returned to console.
+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+-
/*出力条件のリセット*/

.RUN FILE = sample_SQL.txt
+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+-
sel * from dbc.dbcinfoV;

 *** Query completed. 3 rows found. 2 columns returned.
 *** Total elapsed time was 1 second.

InfoKey                                                      InfoData
------------------------------------------------------------ ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
LANGUAGE SUPPORT MODE                                        Standard
RELEASE                                                      17.20.03.09
VERSION                                                      17.20.03.09

+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+-
sel date,time;

 *** Query completed. One row found. 2 columns returned.
 *** Total elapsed time was 1 second.

    Date      Time
--------  --------
25/01/01  12:29:29

+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+-
 *** Encountered EOF on RUN file. Returning to stdin.
+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+-


.EXPORT REPORT FILE report_number_02.txt
 *** To reset export, type .EXPORT RESET
+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+-
SELECT * FROM demo_user.employee_task_tbl;

 *** Query completed. No rows found.
 *** Total elapsed time was 1 second.


+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+-
.IF ERRORCODE != 0 THEN QUIT 12
+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+-

.IF ACTIVITYCOUNT = 0 THEN .GOTO COUNT_0
.GOTO COUNT_0
+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+-
.GOTO NOT_COUNT_0
 *** Skipped.
+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+-

.LABEL COUNT_0
+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+-
UPDATE demo_user.employee_tbl set employee_task = null;

 *** Update completed. 150 rows changed.
 *** Total elapsed time was 1 second.


+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+-
.IF ERRORCODE != 0 THEN QUIT 12
+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+---------+-
.QUIT
 *** You are now logged off from the DBC.
 *** Exiting BTEQ...
 *** RC (return code) = 0
```



### 参考
https://docs.teradata.com/r/Enterprise_IntelliFlex_Lake_VMware/Basic-Teradata-Query-%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9/BTEQ%E3%81%AE%E7%B4%B9%E4%BB%8B