编译失败后应立即查询user_errors或all_errors获取具体错误位置和信息;常见错误包括标识符未声明、调用语法不合法、参数类型不匹配、游标处理不当;对象锁住或依赖失效会导致编译卡死或无效,需逐级检查并修复依赖。
Oracle不会直接告诉你哪行错了,只返回 procedure created with compilation errors。这时候别猜,立刻查错误详情:
select line, position, text from user_errors where name = 'YOUR_PROC_NAME' and type = 'PROCEDURE' order by sequence;
SYS 或 HR),改查 all_errors,并带上 owner 条件line 和 position 指向具体字符位置,不是“第几行”,注意 PL/SQL 中换行和空格也占位置PLS-00201: identifier 'XXX' must be declared,说明变量或对象没声明或不可见Java 调用时抛出 ORA-06550,不代表存储过程本身有问题,而是你发过去的调用语句不合法。关键点:
OUT 参数必须用匿名块:begin my_proc(?, ?); end;,不能只写 {call my_proc(?, ?)}
schema 必须显式写出,my_proc 和 hr.my_proc 在 Oracle 看来是两个东西Integer 给 NUMBER 可以,但传 String 给 NUMBER 会直接在解析阶段报 PLS-00306
registerOutParameter(n, Types.OTHER),且不能调用 setXXX()
execute(),不是 executeUpdate()
PL/SQL Developer 或 SQL*Plus 编译时无响应,不是客户端卡,是 Oracle 内部锁冲突。典型现象是执行 ALTER PROCEDURE ... COMPILE 一直 hang。
select * from v$access where object='YOUR_PROC_NAME';
select sid, serial#, status, program from v$session where sid = <sid_from_above>;
ACTIVE 或 INACTIVE 且长时间没释放,执行:alter system kill session '<sid>,<serial#>';
KILLED 却迟迟不退出,需查 v$process 拿到 spid,在操作系统层用 kill -9(Linux)或 orakill(Windows)干掉status = 'INVALID' 只是表象,背后可能是依赖断裂。单纯 ALTER PROCEDURE xxx COMPILE 常失败或无效。
select referenced_owner, referenced_name, referenced_type from all_dependencies where name = 'YOUR_PROC_NAME' and owner = 'YOUR_SCHEMA';
VALID;尤其注意视图、同义词、DBLink 是否可用SELECT 权限),即使编译通过,运行时也会报 ORA-00942,而该错误常被包裹在 ORA-06550 堆栈里真正麻烦的不是语法错,而是错误信息藏在层层嵌套里:一个 ORA-06550 可能由权限缺失引发,而权限缺失又源于同义词指向了不存在的表——得一层层剥开看,不能只盯着最外层报错。