REPEAT - Basic Teradata Query

Basic Teradata® Queryリファレンス

Product
Basic Teradata Query
Release Number
17.10
Published
2022年2月
Language
日本語
Last Update
2022-02-11
dita:mapPath
ja-JP/nnw1608578382132.ditamap
dita:ditavalPath
ja-JP/obe1474387269547.ditaval
dita:id
B035-2414
Product Category
Teradata Tools and Utilities

目的

この制御によって、ユーザーは、次のSQLリクエストを送信する最大回数を指定できます。

構文



次のような場合に当てはまります。

n
後続のリクエストを実行させる回数。

値が指定されていない場合、デフォルトは1であり、後続のリクエストは実際には反復されず、1回実行されます。

*
インポート ファイルの終わりに達するまで後続のリクエストを繰り返し実行させる
RECSr
1~2251636603879500の整数
p
反復処理の間、SET PACKコマンド設定を上書きする
REQBUFLEN
反復処理の間、PACKコマンドのREQBUFLEN設定を上書きします。
REQBUFLENの数値引数(b)の範囲は1000000から7340032までです。詳細については、PACKの説明を参照してください。

使用上の注意

このコマンドは、通常、USING句を含んだSQLリクエストと共に使用されます。 リクエストは、繰り返されるたびに、入力データ ストリームの次のデータ行が使用されて送られます。 入力ファイルにアクセスできない場合には、このコマンドは取り消されます。 後続のSQLリクエストの構文に誤りがあった場合、REPEATコマンドはセッションごとに1回のみ実行されます。

このコマンドでは、リクエストそのものの定義が非常に重要です。 例えば、次の例では、BEGIN TRANSACTION文が完結された1つの単文リクエストとみなされるために、BT(BEGIN TRANSACTION)文のみが10回実行されることになります。

.REPEAT 10
BT; 
select ... ;
select ... ;
select ... ;
ET;

誤ってこのように入れて実行させた場合には、9個のEND TRANSACTION文を入れてください。さもないと、ログオフするまでに送るリクエストは、SQL Engineによって終了していないトランザクションの一部とみなされ、それらすべてがログオフ時にロールバックされることになります。

トランザクション全体を10回実行させるためには、次のようにします。

.REPEAT 10 
BT 
;select ... 
;select ... 
;select ... 
;ET;

この場合には、セミコロンの位置によって、トランザクション内のすべてのステートメントが1つの複文リクエストとみなされます。

REPEATコマンドは、SQLマクロでは使用できません。

PACK句

REPEATコマンドの構文を拡張して、PACK句を含めることができます。

PACK句の使用上の注意

REPEATコマンドのPACK句は、反復処理の間に、SET PACKコマンドを無効にします。 反復処理が終了すると、パック係数は、SET PACKの使用と関連付けられた値に戻ります。

使用方法の詳細については、PACKを参照してください。

例1 – REPEAT PACK句

.REPEAT * PACK 100

これは、以下と同等です。

EOF(または最大n)に到達するまで反復処理を繰り返し、リクエストごとに最大100レコードをパックする。 実際に送られるレコードの数は、REPEATの完了時に決定される。 パックされるレコード数は、リクエストを送信するたびに変わることがある。

例2 – REPEAT RECS句

正確な数のレコードを確実に転送するには、反復係数にRECS句を使用して「減少した」リクエストを補正します。 次に例を示します。

.REPEAT RECS 200 PACK 100

これは、以下と同等です。

最大200レコードを読み出すまで、必要な反復処理を繰り返し、リクエストごとに最大100レコードをパックする。

REPEATコマンドと=コマンドの相違点

REPEATコマンドは=コマンドに似ています。ただし、以下の相違点があります。
  • REPEATコマンドは、反復させるリクエストの前にに使用します。=コマンドは、リクエストの後でに使用します。
  • REPEATコマンドでは、次のリクエストを合計何回実行させるかを指定します。 =コマンドでは、最後にのリクエストを詳細何回実行させるかを指定します。
  • REPEATコマンドではインポート ファイルの終わりに達するまでリクエストを繰り返し送ることができますが、=コマンドではできません。

REPEATコマンドとCOMPILEコマンドの使用

COMPILEコマンドは、REPEATコマンドと併用すると、nの値に関係なく、1回だけ処理されます。 nの値は、デフォルトで1になります。

REPEATのエラー処理

REPEATの実行中にエラーが発生した場合は、次のように処理されます。

リクエスト 結果
再実行可能 1つ入力されたものとして、リクエストを再試行する。
再実行不可 次のリクエストに移り、処理を続行する。

QUIET ONのときのREPEATコマンドの使用

QUIET ONコマンドが使用され、かつ、単一のセッションがログオンされているときに、REPEATコマンドを使用すると、それぞれのステートメントのあとに、実行時間の概算を示すメッセージが表示されます。 例えば、コマンド.REPEAT 10を指定すると、時間の概算を示す10個のメッセージが表示されます。 ただし、複数のセッションがログオンされている場合には、開始時刻と終了時刻、すなわち、最初のステートメントが指定された時刻と、最後のステートメントが実行された時刻だけが表示されます。 QUIET ON ALLコマンドを使用すると、使用されているセッション数に関係なく、同じ効果が得られます。

複数セッションの実行とREPEATコマンドの使用

REPEATコマンドと共に複数のセッションを実行する場合には、SQLのDATABASE文の前にセッション数を指定したREPEATコマンドを指定します。

SQLのINSERTリクエストが必要なだけ繰り返される3つのセッションを並列で実行するためには、次のように指定します。

.SET SESSIONS 3
.LOGON 0/fml,fml
.REPEAT 3
DATABASE Workforce;
.REPEAT *
USING num(SMALLINT)
INSERT INTO Department (DeptNo) VALUES (:num) ;

最初のREPEATコマンドで、デフォルトのデータベースがすべてのセッションに設定されます。 2番目のREPEATコマンドは、すべてのデータが挿入されるまで3つのセッションを実行させることを示しています。 最初のREPEATコマンドを指定しない場合、Workforce(従業員)データベースを使用するのは最初のセッションだけになります。 他の2つのセッションにはデータベースが指定されていません。

デフォルトのデータベースは、テーブル名を指定するSQL文の中に指定することもできます。例:

.SET SESSIONS 3
.LOGON 0/fml,fml
.REPEAT *
USING num(SMALLINT)
INSERT INTO Workforce.Department (DeptNo) VALUES (:num) ;

この例では、SQLのINSERT文の中に、テーブル名と共にデフォルトのデータベースWorkforceが使用されています。 この場合は、REPEATコマンドは1つしか必要ではありません。

結合インデックスのあるテーブルをTeradataモードで更新している(複数のセッションでBEGIN TRANSACTIONおよびEND TRANSACTIONを使用)ときにデッドロックが発生した場合は、代わりにANSIモードでCOMMITを使用します。

ANSIモード

ANSIモードの場合、セッションのトランザクションは、最初のSQL文によってオープンされます。 また、セッション上でCOMMITかROLLBACKのいずれかのステートメントが送られると、トランザクションはクローズされます。 ANSIモードで .SESSIONコマンドと .REPEATコマンドを使用する場合は、次に示すように、反復されるSQL文と共にCOMMIT文を1つのリクエストとして送る必要があります。例えば、次のようになります。

.SESSION trans ansi
.SESSIONS 10
.logon TPID/USERID, PASSWD
.import data file = <data file name>
.repeat *
using i(integer), j(integer)
insert into <table name> (col1, col2)
values (:i,:j); COMMIT WORK;
.quit

COMMIT文を指定せずに反復されるリクエストを送った場合は、いずれ他のセッションによってそれらのリクエストのいずれかが阻止され、デッドロック状態となってBTEQは停止します。

例3 – REPEATの前のSQL SELECT

SQL SELECT文の出力を2つ示します。最初はREPEATコマンドがない場合(Repeat Offのヘッダー)で、2番目は2回繰り返される場合(Repeat 2のヘッダー)です。

database workforce;
.defaults
.format on
.heading 'Repeat Off'
select   deptname
,loc
,deptno
from     department
order by deptno     ;
.defaults    
.format on    
.heading 'Repeat 2'
.repeat 2
select   deptname
,loc         ,deptno     from     department
order by deptno
;    
.format off
.logoff
.exit

BTEQの応答

 ** Query completed. 5 rows found. 3 columns returned.
                            Repeat Off 
   
DeptName          Loc   DeptNo
--------------    ---   ------
Administration    NYC      100
Exec Office       NYC      300
Engineering       ATL      500
Manufacturing     CHI      600
Marketing         NYC      700
*** Starting at Mon Jul 30 11:15:31 1990 
*** Query completed. 5 rows found. 3 columns returned.
                            Repeat 2 
   
DeptName         Loc   DeptNo
---------------  ---   ------
Administration   NYC      100
Exec Office      NYC      300
Engineering      ATL      500
Manufacturing    CHI      600
Marketing        NYC      700
*** Starting at Mon Jul 30 11:15:31 1990 
*** Query completed. 5 rows found. 3 columns returned.
                            Repeat 2 
   
DeptName         Loc   DeptNo
---------------  ---   ------
Administration   NYC      100
Exec Office      NYC      300
Engineering      ATL      500
Manufacturing    CHI      600
Marketing        NYC      700
*** Query completed. 5 rows found. 3 columns returned.
                            Repeat 2
   
DeptName         Loc   DeptNo
--------------   ---   ------
Administration   NYC      100
Exec Office      NYC      300
Engineering      ATL      500
Manufacturing    CHI      600
Marketing        NYC      700
*** Query completed. 5 rows found. 3 columns returned.
                            Repeat 2
   
DeptName         Loc   DeptNo
--------------   ---   ------
Administration   NYC      100
Exec Office      NYC      300
Engineering      ATL      500
Manufacturing    CHI      600
Marketing        NYC      700
*** Finished at Mon Jul 30 11:15:32 1990
*** Total number of statements: 2, Accepted: 2, Rejected: 0
*** Total elapsed time was 1 second.
*** Total requests run successfully = 2
*** Successful requests per second =  1.688