目的
この制御によって、ユーザーは、次のSQLリクエストを送信する最大回数を指定できます。
構文
次のような場合に当てはまります。
- n
- 後続のリクエストを実行させる回数。
値が指定されていない場合、デフォルトは1であり、後続のリクエストは実際には反復されず、1回実行されます。
- *
- インポート ファイルの終わりに達するまで後続のリクエストを繰り返し実行させる
- RECSr
- 1~2251636603879500の整数
- p
- 反復処理の間、SET PACKコマンド設定を上書きする
- REQBUFLEN
- 反復処理の間、PACKコマンドのREQBUFLEN設定を上書きします。
使用上の注意
このコマンドは、通常、USING句を含んだTeradata SQLリクエストと共に使用されます。 リクエストは、繰り返されるたびに、入力データ ストリームの次のデータ行が使用されて送られます。 入力ファイルにアクセスできない場合には、このコマンドは取り消されます。 後続のSQLリクエストの構文に誤りがあった場合、REPEATコマンドはセッションごとに1回のみ実行されます。
このコマンドでは、リクエストそのものの定義が非常に重要です。 例えば、次の例では、BEGIN TRANSACTION文が完結された1つの単文リクエストとみなされるために、BT(BEGIN TRANSACTION)文のみが10回実行されることになります。
.REPEAT 10 BT; select ... ; select ... ; select ... ; ET;
誤ってこのように入れて実行させた場合には、9個のEND TRANSACTION文を入れてください。 さもないと、ログオフするまでに送るTeradata SQLリクエストは、Teradata Databaseによって終了していないトランザクションの一部とみなされ、それらすべてがログオフ時にロールバックされることになります。
トランザクション全体を10回実行させるためには、次のようにします。
.REPEAT 10 BT ;select ... ;select ... ;select ... ;ET;
この場合には、セミコロンの位置によって、トランザクション内のすべての文が1つの複文リクエストとみなされます。
REPEATコマンドは、Teradata SQLマクロでは使用できません。
PACK句
REPEATコマンドの構文を拡張して、PACK句を含めることができます。
PACK句の使用上の注意
REPEATコマンドのPACK句は、反復処理の間に、SET PACKコマンドを無効にします。 反復処理が終了すると、パック係数は、SET PACKの使用と関連付けられた値に戻ります。
使用方法の詳細については、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コマンドとCOMPILEコマンドの使用
COMPILEコマンドは、REPEATコマンドと併用すると、nの値に関係なく、1回だけ処理されます。 nの値は、デフォルトで1になります。
REPEATのエラー処理
REPEATの実行中にエラーが発生した場合は、次のように処理されます。
リクエスト | 結果 |
---|---|
再実行可能 | 1つ入力されたものとして、リクエストを再試行する。 |
再実行不可 | 次のリクエストに移り、処理を続行する。 |
QUIET ONのときのREPEATコマンドの使用
QUIET ONコマンドが使用され、かつ、単一のセッションがログオンされているときに、REPEATコマンドを使用すると、それぞれの文のあとに、実行時間の概算を示すメッセージが表示されます。 例えば、コマンド.REPEAT 10を指定すると、時間の概算を示す10個のメッセージが表示されます。 ただし、複数のセッションがログオンされている場合には、開始時刻と終了時刻、すなわち、最初の文が指定された時刻と、最後の文が実行された時刻だけが表示されます。 QUIET ON ALLコマンドを使用すると、使用されているセッション数に関係なく、同じ効果が得られます。
複数セッションの実行とREPEATコマンドの使用
REPEATコマンドと共に複数のセッションを実行する場合には、Teradata SQLのDATABASE文の前にセッション数を指定したREPEATコマンドを指定します。
Teradata 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つのセッションにはデータベースが指定されていません。
デフォルトのデータベースは、テーブル名を指定するTeradata SQLコマンドの中に指定することもできます。例えば、次のようになります。
.SET SESSIONS 3 .LOGON 0/fml,fml .REPEAT * USING num(SMALLINT) INSERT INTO Workforce.Department (DeptNo) VALUES (:num) ;
この例では、Teradata 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