Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 12.0.1 » SQL Anywhere サーバー SQL の使用法 » SQL Anywhere のデバッガー » チュートリアル:デバッガーの使用開始

 

レッスン 2:ストアドプロシージャーのデバッグ

このレッスンでは、デバッガーを使用してストアドプロシージャーのエラーを識別する方法を説明します。SQL Anywhere のサンプルデータベース、demo.db には、debugger_tutorial という名前の意図的にエラーが含まれたストアドプロシージャーがあります。debugger_tutorial プロシージャーは、発注額の最も多い会社名とその発注額を含む結果セットを返さなければなりません。プロシージャーは、会社と発注をリストするクエリの結果セットをループしてこれらの値を計算します。(この結果は、プロシージャーにこの論理を追加しなくとも、SELECT FIRST クエリを使用して得ることができます。このプロシージャーは説明を目的としたものです)。ただし、debugger_tutorial プロシージャーにはバグが含まれているためエラーになり、指定された結果セットが返されません。このレッスンでは、ストアドプロシージャーを実行し、バグの診断と修正を行います。

 ♦ debugger_tutorial ストアドプロシージャーの実行
  1. Sybase Central の左ウィンドウ枠で、[プロシージャーとファンクション] をダブルクリックします。

  2. [Debugger_Tutorial (GROUPO)] を右クリックし、[Interactive SQL から実行] をクリックします。

    Interactive SQL が開き、次の結果セットが表示されます。

    top_company top_value
    (NULL) (NULL)

    これは、正しい結果ではありません。チュートリアルの続きで、この結果をもたらしたエラーを診断します。

  3. Interactive SQL を閉じます。

プロシージャーのバグを診断するには、プロシージャーにブレークポイントを設定して、最初の実行文から開始します。コード全体について、プロシージャーを実行しながら変数の値を監視します。

 ♦ バグの診断
  1. [モード]  » [デバッグ] をクリックします。

  2. 右ウィンドウ枠で、[Debugger_Tutorial (GROUPO)] をダブルクリックします。

  3. 右ウィンドウ枠で、次の文を検索します。

    OPEN cursor_this_customer;
  4. ブレークポイントを追加するには、左側にあるグレーの縦線の領域をクリックします。ブレークポイントは、赤い円で表示されます。

  5. 左ウィンドウ枠で、[Debugger_Tutorial (GROUPO)] を右クリックし、[Interactive SQL から実行] をクリックします。

    Sybase Central の右枠に、ブレークポイントを表す赤い円の上部に黄色の矢印が表示されます。

  6. [デバッガーの詳細] ウィンドウで [ローカル] タブをクリックし、プロシージャー内のローカル変数とその現在の値とデータ型のリストを表示します。Top_CompanyTop_ValueThis_ValueThis_Company の各変数は、すべて初期化されていないため、NULL を示しています。

  7. [F11] キーを押して、プロシージャーをスクロールします。次の行に到達すると、変数の値が変化します。

    IF SQLSTATE = error_not_found THEN
  8. [F11] キーをもう一度押して、分岐を確認します。黄色の矢印が、次のテキストに戻ります。

    customer_loop: loop

    IF テストは TRUE を返しませんでした。テストが失敗したのは、NULL とどのような値を比較しても NULL が返されるためです。NULL 値によりテストは失敗し、IF...END IF 文内のコードは実行されませんでした。

    このことから、Top_Value が初期化されていないことが原因とわかります。

Top_Value が初期化されていないことが原因であるという仮説をテストするために、プロシージャーコードを変更する必要はありません。

 ♦ 仮説のテスト
  1. [デバッガーの詳細] ウィンドウで、[ローカル] タブをクリックします。

  2. [Top_Value] 変数をクリックし、[値] フィールドに 3000 を入力し、[Enter] を押します。

  3. [This_Value] 変数の [値] フィールドが 3000 よりも大きな値になるまで [F11] キーを繰り返し押します。

  4. ブレークポイントをクリックして、グレーにします。

  5. [F5] キーを押して、プロシージャーを実行します。

    [Interactive SQL] ウィンドウが再び表示されます。正しい結果が表示されています。

    top_company top_value
    Chadwicks 8076
  6. Interactive SQL を閉じます。

仮説が正しいことが確認されました。Top_Value が初期化されていないことが原因でした。

 ♦ バグの修正
  1. [モード]  » [設計] をクリックします。

  2. 右ウィンドウ枠で、次の文を検索します。

    OPEN cursor_this_customer;
  3. Top_Value 変数を初期化する新しい行を入力します。

    SET top_value = 0;
  4. [ファイル]  » [保存] をクリックします。

  5. プロシージャーを再度実行し、Interactive SQL に正しい結果が表示されることを確認します。

このレッスンは終了です。[Interactive SQL] ウィンドウが開いている場合は閉じます。