MySQL中級:条件処理(エラー、異常処理)


条件処理は2つの文に関連し、1つはDECLARE...CONDITION、もう一つはDECLARE....HANDLER.まずDECLAREを見てみましょう...HANDLER.
1、DECLARE....HANDLER文
この文は、データベースに何らかの状況が発生した場合に使用され、具体的な処理方法(handler)を定義します.ここでは、
  • 何があったの?
  • は、それをどのように処理するか.
  • DECLARE handler_type HANDLER FOR condition_value[,...] sp_statement
     
    handler_type:
        CONTINUE
      | EXIT
      | UNDO
     
    condition_value:
        SQLSTATE [VALUE] sqlstate_value
      | condition_name
      | SQLWARNING
      | NOT FOUND
      | SQLEXCEPTION
      | mysql_error_code

    この中で注意しなければならない点はいくつかあります.
  • condition_value[,condition_value]は、複数の状況(括弧はオプションを表す)を含むことができ、すなわちhandlerは複数の状況に対して対応する操作を行うように定義することができる.その他condition_valueに含まれる値は、上記の6種類:1、mysql_error_code、これはmysqlを表すエラーコードで、エラーコードは数字で、完成はmysqlが自分で定義したもので、この値はmysqlデータベースのエラーコードと情報を参照することができます.2、SQLSTATE [VALUE] sqlstate_value、これはエラーコードと似ていて1つ1つの対応関係を形成して、それは5文字の文字列で、肝心なところはANSIとSQLとODBCのこれらの標準の中から引用したので、そのため更に標準化して、上のerror_とは違いますcodeは完全にmysqlが自分で定義して自分で使ったもので、これは最初と同じようにmysqlデータベースのエラーコードや情報を参照することもできます.3、condtion_名前、これは条件名です.DECLAREを使用しています.CONDITION文で定義します.この後、自分のconditionを定義する方法について説明します.name.4、SQLWARNINGは、SQLSTATEの文字列が‘01’で始まるエラーを表し、例えばError:1311 SQLSTATE:1000(ER_SP_UNNIT_VAR)5、NOT FOUNDを表し、SQLSTATEの文字列が‘02’で始まるエラーを表し、例えばError:1329 SQLSTATE:02000(ER_SP_FETCH_NO_DATA)である.つまり、レコードの最後にカーソルを移動する場合です.6、SQLEXCEPTIONは、SQLSTATEの文字列が'00'、'01'、'02'で始まるエラーではないことを示し、ここで'00'で始まるSQLSTATEは実際にはエラーではなく成功した実行を示し、他の2つは上記の4と5の2つの状況である.

  • 上の6つの状況は実は2つの種類に分けることができて、1つは比較的に明確な処理で、指定した誤りの情況に対して処理を行って、1、2、3の3つの方式を含みます;もう1つは、対応するタイプのエラーに対する処理であり、4、5、6の3つの方法を含むエラーのグループに対する処理である.これはconditionを紹介していますvalue.
    また、MySQLがデフォルトで(つまりエラーを処理する方法を定義していない-handler)独自のエラー処理メカニズム:1、SQLWARNINGとNOT FOUNDの処理方法はエラーを無視して実行し続けるので、カーソルの例ではrepeatの条件判断の値にno_more_products=1のhandlerで処理すると,ループはずっと続く.2、SQLEXCEPTIONの場合、デフォルトの処理方法はエラーが発生した箇所で終了します.
  • statement、これは比較的簡単な条件/エラーが発生した場合、私たちが実行する文は、SET var=valueのような簡単な文でも、複雑な複数行の文でも、複数行ならBEGINを使うことができます.....ENDここでは文を含めます(私たちのストレージプロセスも複数行あることに気づいたので、BEGIN....ENDも必要です).
  • handler_type,これは,上記のstatementを実行した後,どのような動作を実行したいかを示すもので,ここにはCONTINE,EXIT,UNDOが含まれ,継続,終了,取り消し(一時的にはサポートされない)を示す.こちらは2つの動作ですが、実はこの2つの動作は前述したように、CONTINEはSQLWARNINGとNOT FOUNDのデフォルト処理方法であり、EXITはSQLEXCEPTIONのデフォルト処理方法です.CONTINUEプロセッサの場合、現在のサブルーチンの実行は、プロセッサ文の実行後に続行されます.EXITプロセッサの場合、現在のBEGIN...END複合文の実行が終了します.UNDOハンドラタイプ文はサポートされていません.

  • 2、DECLARE...CONDITION文という文は、実は私たちのエラー条件をより明確にするためのもので、上記の場合、SQLSTATE'23000'のような表現は直感的ではない方法で、対応するドキュメントで対応し、読むのは不便です.
    DECLARE condition_name CONDITION FOR condition_value
     
    condition_value:
        SQLSTATE [VALUE] sqlstate_value
      | mysql_error_code

    名前と指定したエラー条件を関連付けます.この名前は、その後DECLARE HANDLER文で使用できます.
    これでは何の役に立つか分からないように見えますが、例を見てみるとわかります.
    --  duplicate_key   SQLSTATE '23000'          
    DECLARE duplicate_key CONDITION FOR SQLSTATE '23000';
    
    DECLARE CONTINUE HANDLER FOR duplicate_key
      BEGIN
        -- body of handler
      END;

    ここではduplicate_keyという条件名はSQLSTATE'23000'に対応し、より直感的に表示されます.このときduplicate_keyはDECLAREについて説明したのですが...HANDLERの時のあのcondition_name.
    参照先:
    http://blog.csdn.net/rdarda/article/details/7884044