调试函数/存储过程
调试操作期间,如果连接丢失,但对象浏览器中仍存在该数据库连接,则“连接错误” 对话框中会存在如下选项:
- “是”:重建连接并重启调试操作。
- “否”:断开对象浏览器中的数据库连接。
- VDS V2.3版本开始支持用户打开多个调试窗口同时调试不同的函数或存储过程。
- SQL 语言函数不支持调试操作。
- 当函数或存储过程返回参数是游标类型时,在调用或调试时支持通过弹窗来查看游标数据,如下图所示:
使用断点
本节包含如下内容:
断点用于暂停其所在行中的 PL/SQL 程序的执行,可用断点控制执行并调试过程。
添加断点后,PL/SQL 程序会在该断点所在的行停止执行,此时用户可以进行其他调试操作。VDS支持以下断点操作:
- 为某行设置或创建断点。
- 删除某行的断点。
运行 PL/SQL 程序时,程序会在设置断点的每一行暂停执行。此时,VDS中检索当前程序状态信息,如程序变量的值。
执行如下步骤调试 PL/SQL 程序:
步骤1: 在需要 PL/SQL 程序暂停执行的行设置断点。
步骤2: 启动调试会话。达到断点所在行时,监视调试窗口中应用程序的状态,然后继续执行程序。
步骤3: 关闭调试会话。
VDS的工具栏中有调试选项,可以帮助您执行可调试对象。
添加断点
执行以下步骤在某行中添加断点:
步骤1: 打开需要添加断点的 PL/SQL 函数。
步骤2: :单击启动调试,在调试窗口中,双击行号字段左侧的断点标尺,设置断点,断点标志表示操作成功。
如果函数在调试过程中不会间断或停止执行,则说明其设置的断点不会生效。
删除断点
用户可删除不再使用的断点。其方法与断点创建的方法相同。
在调试窗口中,打开待删除断点所在的函数,双击断点启用图标, 将断点删除。
修改源代码
调试过程中,如果用户修改了从服务器获取的源代码,并继续进行调试,VDS会提示错误:建议刷新该对象,再次执行调试操作。
如果用户修改了从服务器获取的源代码,且在未设置断点的情况下执行或调 试了该代码,VDS会显示服务器中源代码的执行结果。建议在进行调试或者执行前,进行刷新操作。
使用断点测试 PL/SQL 程序
执行以下步骤使用断点测试 PL/SQL 程序:
步骤1: 打开 PL/SQL 程序,在要调试的行创建断点。例如:16、20 和 22 行。
步骤2: 单击,或按下“F9”。在弹出的参数输入窗口中,输入参数信息。
如果无需输入参数,则参数输入窗口不会弹出。
步骤3: 输入参数信息,单击“确定”。对于 varchar 和 date 数据类型,参数值需加半角单引号(');对于 numeric 数据类型,参数值可以不加半角单引号。
要将参数值设为 NULL,需输入 NULL 或 null。
单击“运行”,可以看到光标指向断点所在行,同时所在行高亮。光标所指的行号, 即为继续执行程序时的起始行号。
可通过在工具栏中单击按钮或按下“Shift+esc”终止调试。调试完成后,函数会继续正常执行,不会在任何断点暂停。“调用堆栈”和“变量”窗格会填充信息,如下图所示:
步骤4: 单击继续执行至下一断点(如有)。“结果”页签中显示执行 PL/SQL 程序的结果。
调试中支持回滚/提交
VDS支持在调试完成后,提交/回滚 PL/SQL 查询结果。
- 如果启用了“调试后自动回滚”选项,则调试后获取的 PL/SQL 执行结果不会保存在数据库中。
- 如果禁用了“调试后自动回滚”选项,则调试后获取的 PL/SQL 执行结果被提交到数据库中。
按如下步骤启用回滚功能:
步骤1: 点击“设置”,点击“首选项”,在“调试”中勾选“调试后自动回滚”。
控制执行
本节包含如下内容:
启动调试
步骤1: 在“对象浏览器”窗格中右键单击需调试的函数/存储过程。选择“调试”打开调试窗口。
步骤2: 点击图标启动调试,如果有参数,则弹出参数输入窗口输入参数后点击“确定”,关闭参数窗口开始调试,光标停留在开始行。
单步跳过
调试执行函数时,用户可使用工具栏中的单步调试命令。通过进行单步控制,可逐行调试程序。
如果进行单步操作时遇到断点,则该单步操作会停止,程序也会暂停执行。“单步跳过”是指一次执行一条语句。单步执行一条语句后,可以在其他调试窗口中查看执行结果。
单步进入
点击按或者按 CTRL+N,都可以逐条语句执行代码。
当单步跳入一个函数,VDS执行当前语句,然后进入调试模式,调试位置由左侧标尺区域中的箭头表示。如果执行语句调用另一个函数,VDS将单步跳入该函数。一旦函数中的所有语句执行完成,VDS将跳回其调用函数的下一语 句。点击单步进入(CTRL+N),进入下一语句如果按“运行”,PL/SQL 代码执行将继续。
单步退出
子程序单步退出,继续该函数的执行,在该过程返回其调用函数后,暂停执行,确定该函数的剩余部分无需调试后,可单步退出该段函数。然而,如果该函数其余部分设置了断点,在返回调用函数前,该断点将被命中。
单步退出过程会执行函数。单步退出操作的快捷键是“Ctrl+T”。
运行
调试进程在某一位置停止时,可单击工具栏中的图标或使用快捷键CTRL+R继续 PL/SQL 函数执行。
VDS V2.4开始支持在调试窗口查看raise函数的输出结果。并且支持在sql终端查看raise输出结果(包括执行匿名块以及调用函数/过程)。
查看调试信息
使用 VDS时,可通过一些调试窗口查看调试信息。本节介绍可用于检查调试信息的操作:
查看调用堆栈
“调用堆栈”窗格展示调用过程时的过程链。可从小化窗口窗格中打开“调用堆栈”窗格。近的过程在顶部,早的在底部。
查看/设置变量
“变量”窗格用于监视信息或估算值。可从小化窗口窗格中打开“变量”窗格。通过这个窗格,可以查看或者修改 PL/SQL 过程中的变量或参数。
执行代码时,默认展示全部变量,可手动增加、修改或删除变量,修改当前变量的值后将对后续执行结果产生影响,此操作仅对最上层栈的变量生效。
“变量”窗格中, 如果输入的是'NULL'或 NULL,参数值显示为 NULL 同样适 用于字符串数据类型。
查看结果
“结果”页签显示 PL/SQL 调试会话的结果,在页签顶部会展示出对应过程名。只有出现执行 PL/SQL 程序的结果时,“结果”页签才会自动弹出。
可以单击“结果”页签上的 图标复制页签内容。详情请参见 使用 SQL 终端。
- “结果”页签中的工具指导多可以展示 10 行,每行多包含 80 个字符。
- 如果执行查询的结果是 NULL,则显示为空。
- 表格数据中的 Tab 字符(ASCII 009)不会显示在“结果”、“查看表数据”和“属性”窗口中。复制/导出的数据中会正确包含 Tab 字符。工具提示中也会正确显示 Tab 字符。
代码折叠/展开
SQL 终端”支持过程/函数代码块折叠/展开特性,具体场景如下:
- BEGIN-END 块
- IF-END IF 块
- DML 语句块(SELECT/UPDATE/INSERT/DELETE/TRUNCATE)
- DDL 语句块(CREATE/DROP/ALTER)
PL/SQL 块 开始 结束 嵌套 DECLARE-BEGIN-END 以关键字DECLARE或BEGIN开始。 DECLARE:以下一个BEGIN 结束。 BEGIN:开始。 END :结束。 说明:DECLARE 为可选关键字。DECLARE :无自嵌套 BEGIN 块无嵌套所有剩余块支持嵌套 BEGIN :自嵌套所有剩余块支持嵌套 IF-END IF 以关键字 IF、ELSE或 ELSIF 开始。 IF:以相应 END IF 或下一个ELSE/ELSIF 结束。如果没有 IF,则该PL/SQL 块以文件末尾结束。 ELSE:以相应 END IF 或下一个 ELSIF 结束。如果没有ELSE,则该 PL/SQL 块以文件末尾结束。 ELSIF:以相应 END IF 结束。如果没有ELSIF,则该 PL/SQL块以文件末尾结束。 自嵌套 所有剩余块支持嵌套 SELECT 以关键字 SELECT开始。 以分隔符(;)结束。 以其他块关键字结束,当 SELEC 使用 UNION、(和INTERSEAT 时除外。 如果没有SELECT,则该PL/SQL 块以文件末尾结束。 自嵌套 所有剩余块不支持嵌套 INSERT 以关键字INSERT开始。 以分隔符(;)结束。 以其他块关键字结束,无嵌套。 以文件末尾出现INSERT结束。 无嵌套 SELECT语句嵌套 UPDATE 以关键字UPDATE开始。 以分隔符(;)结束。 以其他块关键字结束,无嵌套。 以文件末尾出现UPDATE结束。 无自嵌套 SELECT 语句嵌套(SELECT 应放到圆括号内) DELETE 以关键字 DELETE开始。 以分隔符(;)结束。 以其他块关键字结束,无嵌套。 以文件末尾出现DELETE结束。 无自嵌套 SELECT 语句嵌套(SELECT 应放到圆括号内) TRUNCATE 以关键字TRUNCATE 开始。 以分隔符(;)结束。 如果没有TRUNCATE,则该 PL/SQL 块以文件末尾结束 无自嵌套 无其他语句嵌套 DDL语句块(CREATE/DROP/ALTER) CREATE 以关键字 CREATE开始。 以分隔符(;)结束。 以分隔符(;)前再次出现关键字CREATE 结束。 如果没有CREATE,则该PL/SQL 块以文件末尾结束。 无自嵌套
说明:适用CREATE TABLE/CREATE VIEW等。Procedures,Functions和 Packages 以关键字 CREATE OR REPLACE Procedures, Functions and Packages 开始。 以分隔符($$)结束。 以关键字 END 结束。 如果没有Procedures/Functions,则该 PL/SQL块以文件末尾结束。 所有剩余块支持嵌套不检查自嵌套 ALTER 以关键字 ALTER 开始。 以分隔符(;)结束。 以分隔符(;)前再次出现关键字ALTER 结束。 以文件末尾出现ALTER 结束。 无自嵌套
说明:适用 ALTER TABLE/ALTER VIEW等。LOOP-END LOOP 以关键字 LOOP 开始。 以相应关键字END LOOP 结束。 以文件末尾出现LOOP-END LOOP结束。 所有剩余块支持嵌套(根据语法定义,实际是不支持的)