调试pl/sql前须确认三件事:目标过程已用debug选项重新编译、当前用户具备debug connect session和debug any procedure权限、数据库参数plsql_debug=true已生效,缺一不可。

DEBUG 选项重新编译、当前用户有 DEBUG CONNECT SESSION 和 DEBUG ANY PROCEDURE 权限、数据库参数 PLSQL_DEBUG=TRUE 已生效。缺一不可,否则点“调试”按钮毫无反应。
编译时必须加 DEBUG 选项,不是 CREATE 时加
很多人误以为 CREATE OR REPLACE PROCEDURE ... 语句里写个 DEBUG 就行了——实际完全无效。DEBUG 是编译行为,不是语法关键字。
- 在 SQL Developer 或 PL/SQL Developer 中,右键已存在的存储过程 → 选
Recompile(不是Run)→ 勾选With DEBUG - 命令行下等效操作是:
ALTER PROCEDURE schema.proc_name COMPILE DEBUG; - 若过程依赖其他对象(如包体),它们也得单独用
COMPILE DEBUG编译,否则断点进不去内部调用 - 编译后查
ALL_PLSQL_OBJECT_SETTINGS,确认PLSQL_DEBUG列值为ENABLED
调试必须靠匿名块触发,不能直接“运行过程”
Oracle 不允许对命名过程(如 my_proc)直接设断点并启动调试。你必须写一个调用它的匿名块,IDE 才能挂载调试器。
- 在 SQL Worksheet 或测试窗口中写:
BEGIN my_proc(p_in => 123, p_out => :out_val); END;
- 注意:
OUT参数要用绑定变量:out_val,不能写死值;否则调试器无法捕获返回值 - 在匿名块的
BEGIN行或过程调用行设断点,而不是在过程定义里——过程体里的断点只有进入后才生效 - PL/SQL Developer 点
Test按钮会自动帮你生成这个匿名块;SQL Developer 需手动写或用Debug按钮自动生成
调试时变量值看不到?先检查 DBMS_OUTPUT 和会话权限
单步执行时鼠标悬停看变量、或在 Variables 窗口输入变量名却显示 undefined,常见原因不是代码问题,而是环境没配好。
-
DBMS_OUTPUT.ENABLE必须在调试会话中显式执行一次,否则DBMS_OUTPUT.PUT_LINE不输出,变量监控也可能失效 - 确保调试连接使用的用户具备
SELECT权限访问ALL_SOURCE和ALL_ARGUMENTS,否则 IDE 无法读取源码结构 - 如果变量是复合类型(如
RECORD或嵌套表),IDE 可能只显示地址而非内容;此时改用DBMS_OUTPUT.PUT_LINE(TO_CHAR(my_record.field))打印具体字段 - 本地监听端口(默认 4000)被占用会导致调试器连不上数据库进程,错误信息常为
ORA-30678: too many connections或静默失败











