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