Oracle建包必须分两步:先建SPEC再建BODY,顺序错误会报PLS-00103;DBeaver需启用PL/SQL调试、驱动≥ojdbc8且正确配置连接属性,否则断点不可用。

能直接建,但必须分两步:先建规范(SPEC),再建体(BODY),顺序错或混写会报 PLS-00103 错误。
连接时没开调试支持,包体里断点全灰
DBeaver 默认不启用 PL/SQL 调试,即使包编译通过,你也无法在 BODY 里设断点、看变量值。这不是代码问题,是连接配置漏项:
- 新建 Oracle 连接后,进“连接属性” → “通用”页签 → 勾选
Enable PL/SQL debugger - 确认驱动版本 ≥
ojdbc8(如21.7.0.0),旧版(如ojdbc6)可能根本不加载调试协议 - 如果用的是 OCI 模式,需额外安装 Oracle Client 并配置
ORACLE_HOME,JDBC 模式更稳
新建包必须分开写 SPEC 和 BODY,不能合在一个 CREATE 语句里
Oracle 要求包的规范和体必须独立编译。DBeaver 的“新建包”向导会自动切出两个页签(Specification 和 Body),但很多人习惯性把两段都粘到 Specification 页里执行,结果:
-
CREATE OR REPLACE PACKAGE ...部分能过 -
CREATE OR REPLACE PACKAGE BODY ...报ORA-04043: object xxx does not exist—— 因为 SPEC 还没真正入库(只在编辑器缓存) - 正确做法:先在
Specification页写完并按Ctrl+Enter执行;等提示“成功”,再切到Body页写实现、再执行
包里用了 AUTHID CURRENT_USER,调用时权限报错怎么办
加了 AUTHID CURRENT_USER 的包,运行时按调用者权限查表,不是包拥有者权限。常见现象是:包所有者能编译通过,别人一调就报 ORA-00942: table or view does not exist:
- 检查调用方是否对包里访问的表有直接
SELECT权限(不是通过角色授予的) - 避免在
SPEC中声明游标或变量——AUTHID CURRENT_USER只影响运行时,但声明阶段仍走定义者权限,容易混淆 - 调试时注意:你在 DBeaver 里用哪个用户连的,就以谁的身份运行,别默认当成包 owner
最容易被忽略的是:包编译成功 ≠ 能被调用。SPEC 和 BODY 各自独立校验语法和依赖,BODY 编译失败不会回滚 SPEC,导致导航树里包名显示正常,点开却看不到函数列表——务必在“数据库导航”中右键包名 → “刷新对象”,确认 Functions / Procedures 节点下有内容。


















