ttIsql内でのエラー・リカバリの指定
WHENEVER
SQLERROR
コマンドを発行すると、SQLエラーの発生時の対処法を指示できます。WHENEVER
SQLERROR
は、SQL文、SQLスクリプトまたはPL/SQLブロックのリカバリ・アクションの設定に使用できます。
ttIsqlの使用中にSQLエラーが発生すると、デフォルトでは、エラー情報が表示されてttIsqlが続行されるので、ユーザーは新しいコマンドを入力できます。デフォルト設定は、WHENEVER SQLERROR CONTINUE NONE
です。エラーが発生するたびにttIsqlを終了することを指定することも可能ですが、これは対話的に使用する場合またはSQLスクリプトまたはPL/SQLブロックの実行する場合、は最良の対処法ではない場合があります。
ノート:
WHENEVER SQLERROR
コマンドの構文については、Oracle TimesTen In-Memory DatabaseリファレンスのttIsqlの項を参照してください。
次の例では、EXIT
を使用しエラー・コード255を返し、ttIsqlを終了する前に現在の接続にすべての変更を保存するようCOMMIT
文が実行されます。この例では、Cシェルecho $status
コマンドを使用してエラー・コードを取得します。
Command> WHENEVER SQLERROR EXIT 255 COMMIT; Command> SELECT emp_id FROM employee; 2206: Table PAT.EMPLOYEE not found WHENEVER SQLERROR exiting. % echo $status 255
次の例では、エラーが発生した際に、WHENEVER
SQLERROR
コマンドによってttIsqlコマンドまたはTimesTenユーティリティを実行する方法を示します(エラーが別のTimesTenユーティリティで発生した場合もこの方法を使用できます)。
Command> WHENEVER SQLERROR EXEC "DSSIZE;CALL TTSQLCMDCACHEINFOGET();"; Command> call TTCACHEPOLICYGET; 5010: No OracleNetServiceName specified in DSN The command failed. DSSIZE; PERM_ALLOCATED_SIZE: 32768 PERM_IN_USE_SIZE: 9204 PERM_IN_USE_HIGH_WATER: 9204 TEMP_ALLOCATED_SIZE: 40960 TEMP_IN_USE_SIZE: 7785 TEMP_IN_USE_HIGH_WATER: 7848 CALL TTSQLCMDCACHEINFOGET(); CMDCOUNT, FREEABLECOUNT, SIZE < 10, 7, 41800 > 1 row found.
次に、SUPPRESS
コマンドのオプションを示します。これでは、すべてのエラー・メッセージが抑止され、次のコマンドに進みます。この例では、別のコマンド・オプション(この場合はEXIT
コマンド)を使用して、既存の接続でエラー・メッセージを再度表示できることを示しています。
Command> WHENEVER SQLERROR SUPPRESS; Command> SELECT *; Command> WHENEVER SQLERROR EXIT; Command> SELECT *; 1001: Syntax error in SQL statement before or at: "", character position: 9 select * ^ WHENEVER SQLERROR exiting.
次の例では、SQLエラーが発生したときに戻される値であるretcode
というバインド変数を設定します。
Command> VARIABLE retcode NUMBER := 111; Command> WHENEVER SQLERROR EXIT :retcode; Command> INSERT INTO EMPLOYEES VALUES ( 202, 'Pat', 'Fay', 'PFAY', '603.123.6666', TO_DATE ('17-AUG-1997', 'DD-MON-YYYY'), 'MK_REP', 6000, NULL, 201, 20); 907: Unique constraint (EMPLOYEES on PAT.EMPLOYEES) violated at Rowid <BMUFVUAAACOAAAAIiB> WHENEVER SQLERROR exiting. % echo $status; 111