代码之家  ›  专栏  ›  技术社区  ›  Mads Mobæk

有更好的方法调试SQL吗?

  •  8
  • Mads Mobæk  · 技术社区  · 15 年前

    我已经使用SQL好几年了,主要是MySQL/PhpMyAdmin,最近还使用了Oracle/iSqlPlus和PL/SQL。我用PHP、Java、ActionScript等编程。我意识到SQL不像其他语言那样是一种命令式编程语言——但为什么SQL中的错误消息看起来不那么具体?在其他环境中,我直接指出了问题的根源。通常情况下,MySQL会给我诸如“erroraroundwhere u.id=…”之类的错误,并打印整个查询。这对于存储过程来说更为困难,因为在存储过程中调试可能是一场噩梦。

    我是否错过了一个神奇的工具/语言/插件/设置,可以提供更好的错误报告,还是我们被困于此?我想要一种调试器或语言,它可以为我提供与Eclipse在设置断点和单步执行代码时相同的控制量。这可能吗?

    5 回复  |  直到 15 年前
        1
  •  7
  •   HLGEM    15 年前

    我认为答案在于SQL是一种基于集合的语言,附带了一些过程性的东西。由于设计人员是用基于集合的术语进行思考的,所以他们不认为其他语言具有的普通类型的调试是重要的。然而,我认为有些情况正在改变。您可以在SQL Server 2008中设置断点。我还没有真正使用它,因为在它工作之前,您必须拥有SQL Server 2008数据库,而且我们的大多数数据库仍然是SQL Server 2000。但它是可用的,它确实允许你逐步完成事情。当select语句有150行长,并且它知道语法不正确,但它不能准确指出位置时,仍然会遇到问题,因为它是一个命令。

    就我个人而言,当我编写一个较长的程序性SP时,我会在一个测试模式中构建,包括向我展示我所做的事情的结果、我感兴趣的特定点的关键变量的值,以及打印让我知道已完成哪些步骤的语句,然后在完成后将整个过程回滚。这样我就可以看到如果它真的运行会发生什么,但如果我弄错了,就不会损坏数据库中的任何数据。我觉得这很有用。它可以大大增加你的进程的大小。我有一个我使用的模板,其中包含了我需要设置的大部分结构,所以我不需要花费太多时间来完成。尤其是因为我从未添加过插入。在不首先测试关联的select以确保我拥有所需的记录的情况下更新或删除proc。

        2
  •  4
  •   Carl Manaster    15 年前

    我不认为这会使调试器/IDE无法更精确地识别错误,但我怀疑这会使识别更困难。

        3
  •  1
  •   Bob Probst    15 年前

    在每个事务或重要逻辑片段之前和之后,我将存储过程名称、步骤时间戳和行计数(如果相关)写入日志表。我发现当我完成这项工作后,我通常可以在几分钟内缩小问题范围。

        4
  •  1
  •   Austin Salonen gmlacrosse    15 年前

    至于断点和单步执行代码,您可以使用MS SQL Server实现这一点(在我看来,在2005+上比在2000上更容易实现)。

    对于简单的情况,早期的开发调试,有时神秘的消息通常足以解决错误——语法错误,不能用Y来做X。如果我在一个艰难的存储过程中,我会在存储过程文本上恢复到“printf调试”,因为它既快又简单。使用您选择的数据库一段时间后,简单的问题就会变得老掉牙,您可以从容应对。

        5
  •  0
  •   Yordan Georgiev    15 年前

    我确实使用了以下策略。

    在写入存储过程期间,有一个@procStep变量 每次执行新的逻辑步骤时

    其余的是 here