SQL Developer调试前必须确认三件事:PLSQL_DEBUG参数为TRUE、用户已授DEBUG CONNECT SESSION和DEBUG ANY PROCEDURE权限、存储过程以“Compile for Debug”方式编译。

SQL Developer调试前必须确认的三件事
不满足这三项,点“调试”按钮后只会看到 ORA-01031: insufficient privileges 或直接无响应。
- 数据库参数
PLSQL_DEBUG必须为TRUE(需 DBA 执行ALTER SYSTEM SET PLSQL_DEBUG=TRUE SCOPE=BOTH;) - 当前用户已显式授予
DEBUG CONNECT SESSION和DEBUG ANY PROCEDURE权限(仅CREATE SESSION不够) - 存储过程编译时选的是“Compile for Debug”,不是普通“Compile”——右键菜单里有明确区分,F9 默认是普通编译
带 OUT/IN OUT 参数的调试启动方式
不能用匿名块 BEGIN ... END; 手动调用再进调试器,那样断点不会命中。必须走 SQL Developer 原生调试入口。
- 在存储过程编辑器中右键 → 选择
Debug(不是Run) - 弹出窗口里填入
IN参数值(如123),OUT和IN OUT参数留空或填占位符(如NULL),SQL Developer 会自动声明对应变量并传入 - 若过程有多个
OUT参数,调试器会在“Variables”面板里列出所有输出变量,执行完后才能看到真实值;断点期间它们仍是NULL
复杂参数(如自定义 TYPE、RECORD、TABLE)怎么传
SQL Developer 的调试对话框只支持标量类型(NUMBER、VARCHAR2、DATE)。遇到 RECORD 或嵌套表,必须改用匿名块包装再调试。
- 先在 SQL Worksheet 中写一个调用块,显式声明并初始化复杂参数:
DECLARE v_input_rec my_package.my_record_type := my_package.my_record_type(100, 'test'); v_output_tab my_package.my_table_type := my_package.my_table_type(); BEGIN my_proc(v_input_rec, v_output_tab); END;
- 把光标放在
BEGIN行,右键 →Debug—— 这样整个块进入调试,断点在存储过程内部依然有效 - 注意:自定义 TYPE 必须在包头(
PACKAGE)中声明,且调试用户要有EXECUTE权限,否则编译报PLS-00201: identifier must be declared
调试时变量值看不出来?检查这三个地方
常见现象是鼠标悬停没反应、监视窗口显示 ,不是工具坏了,而是作用域或编译问题。
- 确保断点设在
BEGIN之后的可执行语句行(比如SELECT ... INTO那行),别设在声明区或注释行 - 如果变量是
OUT参数,在赋值语句(如p_result := 42;)执行前,它的值始终是NULL,悬停也看不到内容 - 若过程内用了
PRAGMA INLINE或启用了PLSQL_OPTIMIZE_LEVEL=3,部分变量可能被优化掉,临时降级到 2 再试
最易被忽略的是:调试器看到的变量名是编译后的内部符号名,比如你写 v_user_id,实际可能显示为 __gen_123456789 —— 别慌,它和你代码里的变量是同一个,只是调试信息映射没刷新,多步进一次就正常了。











