3

MySQLストアドプロシージャでは、次のようにSQL例外を処理しています。

DECLARE EXIT HANDLER FOR SQLEXCEPTION 
    BEGIN
        SELECT "SQL exception occured." AS "SQL Exception";
        SHOW ERRORS;
        SHOW WARNINGS;
        ROLLBACK;
    END;

SQL exception occuredメッセージが表示され、トランザクションがロールバックされるため、例外がスローされていることを知っています。ただし、SHOW ERRORSまたはSHOW WARNINGSテーブルには何も入力されていません。これはなぜですか。また、どのSQL例外がスローされているかをどのように確認できますか?

ミステリー例外の原因となっているSQLステートメントは次のとおりです。

SELECT IF(count(*) = 0, TRUE, FALSE) 
FROM information_schema.COLUMNS 
WHERE TABLE_SCHEMA='myDatabase' 
AND TABLE_NAME='exam';

編集:

ボヘミアンは、例外がハンドラーに飲み込まれていることを私に知らせました。では、例外が何であるかを確認し、それでもロールバックするにはどうすればよいですか?Javaのcatchブロックでは、Exception.getMessage()またはを使用して例外を確認できますException.printStackTrace()。MySQLに同様の機能はありますか?

4

1 に答える 1

2

のハンドラーを宣言するSQLEXCEPTIONと、例外が消費されます。これは「処理済み」と見なされるため、「例外」はなくなります。

ストアドプロシージャフローが特定の例外に依存している場合は、特定のSQLSTATEエラーコードのハンドラーを宣言する必要があります。

DECLARE EXIT HANDLER FOR SQLSTATE `23000`

実際には、すべてのハンドラーは実際にはこの形式です。理由は次のとおりです。

  • SQLEXCEPTION、、、またはSQLSTATEで始まらない値のクラスの省略形です'00''01''02'
  • SQLWARNINGSQLSTATEで始まる値のクラスの省略形です'01'
  • NOT FOUNDSQLSTATEで始まる値のクラスの省略形です'02'
于 2012-11-16T19:38:38.007 に答える