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. 重复按 F11,直至 This_Value 变量的 [] 字段大于 3000。

  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 窗口。