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

SQL Anywhere 12.0.1 (Deutsch) » SQL Anywhere Server - SQL-Benutzerhandbuch » SQL Anywhere-Debugger » Praktische Einführung: Erste Schritte mit dem Debugger

 

Lektion 2: Fehlersuche in einer gespeicherten Prozedur

In dieser Lektion wird erklärt, wie Fehler in gespeicherten Prozeduren mithilfe des Debuggers gefunden werden können. Die SQL Anywhere-Beispieldatenbank, demo.db, enthält eine gespeicherte Prozedur namens debugger_tutorial, die wiederum einen absichtlichen Fehler enthält. Die Prozedur "debugger_tutorial" sollte eine Ergebnismenge liefern, die den Namen der Firma mit dem höchsten Auftragswert sowie den Auftragswert selbst enthält. Die Prozedur berechnet diese Werte durch Schleifendurchläufe durch die Ergebnismenge einer Abfrage, die Firmen und Aufträge auflistet. (Dieses Ergebnis könnte durch eine SELECT FIRST-Abfrage erreicht werden, ohne der Prozedur logische Schritte hinzufügen zu müssen. Diese Prozedur wird benutzt, um ein bequemes Beispiel zu erstellen.) Jedoch führt der Fehler in der Prozedur debugger_tutorial dazu, dass die Prozedur nicht die angegebene Ergebnismenge zurückgibt. In dieser Lektion führen Sie die gespeicherte Prozedur aus und diagnostizieren und beheben den Fehler.

 Ausführen der gespeicherten Prozedur debugger_tutorial
  1. Doppelklicken Sie im linken Fensterausschnitt von Sybase Central auf Prozeduren und Funktionen.

  2. Rechtsklicken Sie auf Debugger_Tutorial (GROUPO) und klicken Sie auf Von Interactive SQL aus ausführen.

    Interactive SQL wird geöffnet und die folgende Ergebnismenge erscheint:

    top_company top_value
    (NULL) (NULL)

    Dies ist ein falsches Ergebnis. Im Rest der Einführung wird der Fehler diagnostiziert, der dieses Ergebnis hervorgerufen hat.

  3. Schließen Sie Interactive SQL.

Um die Fehlerdiagnose in der Prozedur durchzuführen, müssen Sie Breakpoints in der Prozedur setzen, beginnend mit der ersten ausführbaren Anweisung. Gehen Sie den Code schrittweise durch und beobachten Sie, wie sich der Wert von Variablen verändert, während die Prozedur ausgeführt wird.

 Fehlerdiagnose
  1. Klicken Sie auf Modus » Debuggen.

  2. Im rechten Fensterausschnitt doppelklicken Sie auf Debugger_Tutorial (GROUPO).

  3. Im rechten Fensterausschnitt suchen Sie nach folgender Anweisung:

    OPEN cursor_this_customer;
  4. Um einen Breakpoint hinzuzufügen, klicken Sie auf den senkrechten grauen Bereich links von der Anweisung. Der Breakpoint wird als roter Kreis dargestellt.

  5. Rechtsklicken Sie im linken Fensterausschnitt auf Debugger_Tutorial (GROUPO) und klicken Sie auf Von Interactive SQL aus ausführen.

    Im rechten Fensterausschnitt von Sybase Central erscheint ein gelber Pfeil auf dem roten Kreis, der den Breakpoint anzeigt.

  6. Klicken Sie im Fensterausschnitt Debugger-Details auf die Registerkarte Lokal, um eine Liste von lokalen Variablen in der Prozedur mit ihrem aktuellen Wert und Datentyp anzuzeigen. Die Variablen Top_Company, Top_Value, This_Value und This_Company sind alle uninitialisiert und daher gleich NULL.

  7. Drücken Sie F11, um durch die Prozedur zu scrollen. Der Wert der Variablen ändert sich, wenn Sie die folgende Zeile erreichen:

    IF SQLSTATE = error_not_found THEN
  8. Drücken Sie noch einmal F11, um festzustellen, welche Verzweigung die Ausführung nimmt. Der gelbe Pfeil bewegt sich zurück zum folgenden Text:

    customer_loop: loop

    Die IF-Prüfung wurde nicht als TRUE zurückgegeben. Der Grund dafür ist, dass ein Vergleich eines beliebigen Wertes mit NULL immer NULL zurückgibt. Durch NULL ist die Bedingung nicht erfüllt und der Code innerhalb der Anweisung IF...END IF wird nicht ausgeführt.

    An dieser Stelle werden Sie möglicherweise bemerken, dass der Grund für das Problem darin liegt, dass Top_Value nicht initialisiert wurde.

Sie können die Hypothese, dass das Problem durch die fehlende Initialisierung von Top_Value hervorgerufen wird, direkt im Debugger prüfen, ohne den Code der Prozedur zu ändern.

 Testen der Hypothese
  1. Im Fenster Debugger-Details klicken Sie auf die Registerkarte Lokal.

  2. Klicken Sie auf die Variable Top_Value, geben Sie 3000 in das Feld Wert ein und drücken Sie die Eingabetaste.

  3. Drücken Sie F11 solange, bis das Feld Wert der Variablen This_Value größer als 3000 ist.

  4. Klicken Sie auf den Breakpoint, sodass er grau wird.

  5. Drücken Sie F5, um die Prozedur auszuführen.

    Das Interactive SQL-Fenster wird angezeigt. Es enthält die richtigen Ergebnisse.

    top_company top_value
    Chadwicks 8076
  6. Schließen Sie Interactive SQL.

Die Hypothese wurde bestätigt. Das Problem liegt darin, dass Top_Value nicht initialisiert ist.

 Beheben des Fehlers
  1. Klicken Sie auf Modus » Design.

  2. Im rechten Fensterausschnitt suchen Sie nach folgender Anweisung:

    OPEN cursor_this_customer;
  3. Geben Sie darunter eine neue Zeile ein, die die Variable Top_Value initialisiert:

    SET top_value = 0;
  4. Klicken Sie auf Datei » Speichern.

  5. Führen Sie die Prozedur erneut aus und prüfen Sie, ob Interactive SQL die richtigen Ergebnisse anzeigt.

Sie haben damit die Lektion abgeschlossen. Schließen Sie alle offenen Fenster von Interactive SQL.