Java调用PL/SQL包存储过程报标识符未声明错误求助
报错排查步骤
你遇到的PLS-00201: identifier 'P2.SHOW_STUDENTS' must be declared错误是Oracle无法识别你调用的包存储过程标识,按以下顺序排查即可:
第一步:确认包编译有效
你执行包创建语句后,需确认
show errors输出无编译错误,也可以执行以下SQL查询包状态:SELECT object_name, object_type, status FROM user_objects WHERE object_name = 'P2' AND object_type IN ('PACKAGE','PACKAGE BODY');如果查询结果中
STATUS列为INVALID,说明包存在编译错误,需要先修复包代码的语法、依赖对象(比如students表是否存在、当前用户是否有权限访问)问题后重新编译。第二步:确认调用方和包所属schema一致
检查你创建
P2包时使用的Oracle用户,和Java JDBC连接配置中使用的用户是否为同一个:- 如果是不同用户,调用时需要带上包所属用户的schema前缀,修改Java代码中的调用语句为:
同时需要用包所属用户登录Oracle,给JDBC连接用户授予执行权限:CallableStatement cs = conn.prepareCall("begin 包所属用户名.p2.show_students(?); end;") ;GRANT EXECUTE ON p2 TO jdbc连接用户名; - 如果创建包时特意用双引号指定了小写名称(比如
create or replace package "p2"),调用时也需要加双引号,否则Oracle默认会按大写匹配标识符。
- 如果是不同用户,调用时需要带上包所属用户的schema前缀,修改Java代码中的调用语句为:
第三步:确认包规范中已公开该存储过程
检查你包规范的代码,确保
show_students的声明没有被遗漏,你给出的代码中包规范用...省略了部分内容,容易出现声明遗漏、名称拼写错误的问题,包规范中必须显式声明该存储过程,外部才能调用。第四步:配置同义词(可选)
如果不想每次调用都带schema前缀,可以用JDBC连接用户登录,创建指向目标包的同义词:
CREATE SYNONYM p2 FOR 包所属用户名.p2;
内容的提问来源于stack exchange,提问作者bunny
相关产品推荐
相关产品推荐

