TeradataモードでSQL文が失敗したとき - 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

Teradataモードでリクエスト内のいずれかの文が実行に失敗すると、失敗を示すメッセージがから返されます。 SQL文が実行に失敗したときには、データベースによってリクエスト全体がアボートされ、失敗した文だけではなくリクエスト内のすべてのステートメントが取り消されます。 さらに、失敗したリクエストがANSIセマンティクスではなくTeradataセマンティクスを使用していて、トランザクションに埋め込められていた場合には、トランザクション全体がアボートされ、そのトランザクション内のすべての文の実行結果が取り消されます。 その結果、データベースは、トランザクションが実行される以前の状態に戻ります。

しかし、BTEQ RETRYコマンドによって再実行されるのは、失敗したリクエストのみです。 トランザクションに埋め込まれたリクエスト、または複文リクエストやマクロの実行に含まれたリクエストが失敗した場合には、そのリクエスト以前のステートメントの実行結果が取り消されます。

このような場合に、失敗したリクエストだけを再実行させると、行なわれてはならないデータベースへの変更を招くことになりかねません。

例1 – RETRY

次のようにコーディングされたトランザクションの場合は、RETRYコマンドのオプションをONに設定しても機能しません。後続のステートメントのいずれかが失敗した場合には、BEGIN TRANSACTION(BTを含む)までのトランザクションがデータベースによってロールバックされるためです。

BEGIN TRANSACTION ;
UPDATE ... ;
UPDATE ... ;
END TRANSACTION ;

ロールバックされたあと、失敗したステートメントがBTEQによって再実行されます。 最初のUPDATE文が失敗した場合は、最初のUPDATE文から再実行されます。

例2 – RETRY

BTEQは、トランザクションではなく、リクエストを再実行します。 トランザクション全体を再実行する場合は、最後のセミコロンを1つだけにして複文を1リクエストとして記述します。 この代替のリクエスト形式により、BTEQはすべてのステートメントを1つのリクエストとして送信でき、それによって、BTEQはRETRY ONを使用している場合にトランザクション全体を再送信することもできます。

SQL文では以下の構文を使用する必要があります。

BEGIN TRANSACTION
; UPDATE ...
; UPDATE ...
; END TRANSACTION ;

例3 – RETRY

以下は、トランザクションをコーディングする別の方法です。

BT;
UPDATE...;
.IF ERRORCODE <> 0 THEN .GOTO FORGETIT
UPDATE...;
.IF ERRORCODE <> 0 THEN .GOTO FORGETIT
UPDATE...;
.IF ERRORCODE <> 0 THEN .GOTO FORGETIT
ET;
.LABEL FORGETIT

RETRYコマンドのオプションをOFFに設定し、各リクエストの実行後にエラー コードをテストすることで、残りのステートメントが無視されるようにします。 ただし、この方法を使用する場合は注意が必要です。 トランザクション内部でマクロが実行されるときには、マクロ内の各ステートメントがBTEQによって個々に実行されるために、これも同じように考えて対処しなければなりません。 EXEC文の実行後にテストするだけでは、マクロ内の最後のステートメントのみをテストすることになるので、うまくいきません。

再試行機能を無効にするには、BTEQ RETRYコマンドを次のように使用します。

.SET RETRY OFF