Hitachi

ノンストップデータベース HiRDB Version 10 SQLリファレンス


7.10.1 RESIGNAL文の形式と規則

〈この項の構成〉

(1) 機能

エラーを発生させ,通知します。このとき,診断領域に診断情報を追加します。

(2) 形式

 RESIGNAL 〔信号値〕
 
 信号値::={SQLSTATE値|条件名}
 SQLSTATE値::=SQLSTATE 〔VALUE〕 文字列定数

(3) オペランド

(a) 信号値::={SQLSTATE値|条件名}

UAPに返す値を指定します。

(b) SQLSTATE値::=SQLSTATE 〔VALUE〕 文字列定数

SQLSTATE値として有効な値(A〜Zの大文字,及び0〜9の数字の組み合わせ)を5文字で指定してください。ただし,次のHiRDBでのSQLSTATEの規則に従って値を指定してください。

  • SQLSTATEクラス(最初の2文字)に'00','01','02',及び'R2'は指定できません。これらの値はエラーを表すクラスではありません。

  • 最初の1文字が'0'〜'5','A'〜'I',及び'R'で始まるSQLSTATEクラスは指定できません。これらの値はHiRDBで予約されています。

SQLSTATEクラスがこれらの規則に従っていない場合,定義時にエラーとなります。SQLSTATE値については,「SQLSTATE変数」を参照してください。

(c) 条件名

条件宣言で宣言した条件名を指定してください。

条件名を指定した場合,SQLSTATEにはエラーを示す'R0000'(異常終了で暗黙的ロールバックなし)が設定されます。

条件名に対応したSQLCODE値を定義している場合,エラーとなります。

(4) 共通規則

  1. RESIGNAL文を実行するまでに,ハンドラを呼び出したSQL手続き文がない場合は,実行時にエラーとなります。

  2. 信号値を指定していない場合,SQLSTATEにはエラーを示す'R0000'(異常終了で暗黙的ロールバックなし)が設定されます。

  3. RESIGNAL文を実行した場合は,SQLCODEに設定される値は次のようになります。

    • 信号値を指定していない場合

      変更されません。ハンドラを呼び出したSQL手続き文を実行したときに設定された値が保持されます。

    • 信号値を指定した場合

      -1400が設定されます。

  4. RESIGNAL文を実行しても,暗黙的ロールバックにはなりません。ただし,トリガの中で実行した場合は,WITHOUT ROLLBACKを指定して定義した表を除いて,暗黙的ロールバックになります。WITHOUT ROLLBACKを指定して定義した表については,RESIGNAL文をトリガの中で実行しても,行更新(追加,削除を含む)の処理完了後はロールバックしません。

  5. RESIGNAL文を実行した場合,診断領域に設定される情報は次のようになります。

    • 信号値を指定していない場合

      診断情報は更新されません。

    • 信号値を指定した場合

      診断領域の文情報項目のNUMBERにはi+1(RESIGNAL文実行前の値をiとする)が,MOREには'N'が設定されます。診断領域の条件情報項目のi番目(条件番号i)に設定されていた情報は,i+1番目(条件番号i+1)に配置されます。ここで,条件情報項目数の最大値を超えた場合は,文情報項目のMOREに'Y'が設定されます。1番目(条件番号:1)の条件情報項目のERROR_SQLには,'RESIGNAL'が設定されます。また,信号値に条件名を指定した場合,CONDITION_IDENTIFIERに条件名,又はSQLSTATE値を指定したときは,CONDITION_IDENTIFIERに'SQLSTATE:xxxxx'(xxxxxは指定したSQLSTATE値)が設定されます。

(5) 留意事項

  1. RESIGNAL文は,SQL手続き,及びトリガ中に指定できます。

(6) 使用例

在庫表(ZAIKO)に対し,指定した商品コードの数量を更新するSQL手続き(ZAIKO_KOUSIN2)を定義します。指定した数量が0未満の値の場合,一致する商品がなかった場合,又は更新に失敗した場合に,RESIGNAL文でエラーを発生させ,それぞれのSQLSTATE値を設定します。

  CREATE PROCEDURE ZAIKO_KOUSIN2(IN USCODE INT,IN USURYO INT)
  BEGIN
    DECLARE illegal_value CONDITION ;
    DECLARE EXIT HANDLER FOR illegal_value
      RESIGNAL SQLSTATE VALUE '66001';
    DECLARE EXIT HANDLER FOR NOT FOUND
      SIGNAL SQLSTATE VALUE '66002';
    DECLARE EXIT HANDLER FOR SQLERROR
      RESIGNAL SQLSTATE VALUE '66003';
    IF USURYO<0 THEN
      SIGNAL illegal_value;
    ELSE
      UPDATE ZAIKO SET ZSURYO=USURYO WHERE ZSCODE=USCODE;
    END IF;
  END