TeradataモードでSQL文が失敗したとき - Basic Teradata Query

Basic Teradata Queryリファレンス

Product
Basic Teradata Query
Release Number
16.20
Published
2018年4月
Language
日本語
Last Update
2019-07-03
dita:mapPath
ja-JP/moy1512703123963.ditamap
dita:ditavalPath
ja-JP/moy1512703123963.ditaval
dita:id
B035-2414
Product Category
Teradata Tools and Utilities

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

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

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

例1 – RETRY

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

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