このレッスンでは、デバッガーを使用してストアドプロシージャーのエラーを識別する方法を説明します。SQL Anywhere のサンプルデータベース、demo.db には、debugger_tutorial という名前の意図的にエラーが含まれたストアドプロシージャーがあります。debugger_tutorial プロシージャーは、発注額の最も多い会社名とその発注額を含む結果セットを返さなければなりません。プロシージャーは、会社と発注をリストするクエリの結果セットをループしてこれらの値を計算します。(この結果は、プロシージャーにこの論理を追加しなくとも、SELECT FIRST クエリを使用して得ることができます。このプロシージャーは説明を目的としたものです)。ただし、debugger_tutorial プロシージャーにはバグが含まれているためエラーになり、指定された結果セットが返されません。このレッスンでは、ストアドプロシージャーを実行し、バグの診断と修正を行います。
Sybase Central の左ウィンドウ枠で、[プロシージャーとファンクション] をダブルクリックします。
[Debugger_Tutorial (GROUPO)] を右クリックし、[Interactive SQL から実行] をクリックします。
Interactive SQL が開き、次の結果セットが表示されます。
top_company | top_value |
---|---|
(NULL) | (NULL) |
これは、正しい結果ではありません。チュートリアルの続きで、この結果をもたらしたエラーを診断します。
Interactive SQL を閉じます。
プロシージャーのバグを診断するには、プロシージャーにブレークポイントを設定して、最初の実行文から開始します。コード全体について、プロシージャーを実行しながら変数の値を監視します。
[モード] » [デバッグ] をクリックします。
右ウィンドウ枠で、[Debugger_Tutorial (GROUPO)] をダブルクリックします。
右ウィンドウ枠で、次の文を検索します。
OPEN cursor_this_customer; |
ブレークポイントを追加するには、左側にあるグレーの縦線の領域をクリックします。ブレークポイントは、赤い円で表示されます。
左ウィンドウ枠で、[Debugger_Tutorial (GROUPO)] を右クリックし、[Interactive SQL から実行] をクリックします。
Sybase Central の右枠に、ブレークポイントを表す赤い円の上部に黄色の矢印が表示されます。
[デバッガーの詳細] ウィンドウで [ローカル] タブをクリックし、プロシージャー内のローカル変数とその現在の値とデータ型のリストを表示します。Top_Company、Top_Value、This_Value、This_Company の各変数は、すべて初期化されていないため、NULL を示しています。
[F11] キーを押して、プロシージャーをスクロールします。次の行に到達すると、変数の値が変化します。
IF SQLSTATE = error_not_found THEN |
[F11] キーをもう一度押して、分岐を確認します。黄色の矢印が、次のテキストに戻ります。
customer_loop: loop |
IF
テストは TRUE を返しませんでした。テストが失敗したのは、NULL とどのような値を比較しても NULL が返されるためです。NULL 値によりテストは失敗し、IF
...END IF
文内のコードは実行されませんでした。
このことから、Top_Value が初期化されていないことが原因とわかります。
Top_Value が初期化されていないことが原因であるという仮説をテストするために、プロシージャーコードを変更する必要はありません。
[デバッガーの詳細] ウィンドウで、[ローカル] タブをクリックします。
[Top_Value] 変数をクリックし、[値] フィールドに 3000 を入力し、[Enter] を押します。
[This_Value] 変数の [値] フィールドが 3000 よりも大きな値になるまで [F11] キーを繰り返し押します。
ブレークポイントをクリックして、グレーにします。
[F5] キーを押して、プロシージャーを実行します。
[Interactive SQL] ウィンドウが再び表示されます。正しい結果が表示されています。
top_company | top_value |
---|---|
Chadwicks | 8076 |
Interactive SQL を閉じます。
仮説が正しいことが確認されました。Top_Value が初期化されていないことが原因でした。
[モード] » [設計] をクリックします。
右ウィンドウ枠で、次の文を検索します。
OPEN cursor_this_customer; |
Top_Value 変数を初期化する新しい行を入力します。
SET top_value = 0; |
[ファイル] » [保存] をクリックします。
プロシージャーを再度実行し、Interactive SQL に正しい結果が表示されることを確認します。
このレッスンは終了です。[Interactive SQL] ウィンドウが開いている場合は閉じます。
![]() |
DocCommentXchange で意見交換できます
|
Copyright © 2012, iAnywhere Solutions, Inc. - SQL Anywhere 12.0.1 |