java.sql.SQLException:ORA-06550:第1行第13列:授予用户执行包的权限后
我花了几个月的时间开发了一个带有Oracle db后端的JAVA应用程序。我使用Netbeans作为我的IDE,使用笔记本电脑上的Oracle12c作为我的数据库。所有PL/SQL都已编译,没有错误 经过大量测试(以架构所有者身份登录)后,我尝试添加一个用户。我创建了一个用户,以SYS#u DBA的身份登录,使用tempPswrd识别的java.sql.SQLException:ORA-06550:第1行第13列:授予用户执行包的权限后,java,user-interface,jdbc,oracle12c,Java,User Interface,Jdbc,Oracle12c,我花了几个月的时间开发了一个带有Oracle db后端的JAVA应用程序。我使用Netbeans作为我的IDE,使用笔记本电脑上的Oracle12c作为我的数据库。所有PL/SQL都已编译,没有错误 经过大量测试(以架构所有者身份登录)后,我尝试添加一个用户。我创建了一个用户,以SYS#u DBA的身份登录,使用tempPswrd识别的创建用户E566299,然后使用授予创建会话和授予在C#FAI#u代码上执行的权限。FAI#u ADMIN_PKG到E566299并收到授予成功的确认 我以这个新
创建用户E566299,然后使用授予创建会话和授予在C#FAI#u代码上执行的权限。FAI#u ADMIN_PKG到E566299
并收到授予成功的确认
我以这个新用户的身份登录到我的应用程序,使用以下命令没有错误:
private static Connection getDbConn(String user, String password) throws SQLException{
OracleDataSource ods = null;
Connection dbConn = null;
user = "c##" + user;
ods = new OracleDataSource();
ods.setURL("jdbc:oracle:thin:@//localhost:1522/orcl.global.ds.XXXXXXXX.com");
ods.setUser(user);
ods.setPassword(password);
dbConn = ods.getConnection();
return dbConn;
}
然后,它在第一个包过程调用中抛出一个错误:
java.sql.SQLException:ORA-06550:第1行第13列:
PLS-00201:必须声明标识符“FAI\U ADMIN\U PKG.检查用户”
ORA-06550:第1行第7列:
PL/SQL:忽略语句
位于oracle.jdbc.driver.t4cttiore.processError(t4cttiore.java:450)
位于oracle.jdbc.driver.t4cttiore.processError(t4cttiore.java:399)
位于oracle.jdbc.driver.T4C8Oall.processError(T4C8Oall.java:1017)
位于oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:655)
位于oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:249)
位于oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:566)
位于oracle.jdbc.driver.T4CCallableStatement.doOall8(T4CCallableStatement.java:210)
位于oracle.jdbc.driver.T4CCallableStatement.doOall8(T4CCallableStatement.java:53)
位于oracle.jdbc.driver.T4CCallableStatement.executeForRows(T4CCallableStatement.java:938)
在oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1075)中
位于oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3820)
位于oracle.jdbc.driver.OraclePreparedStatement.execute(OraclePreparedStatement.java:3923)
在oracle.jdbc.driver.OracleCallableStatement.execute(OracleCallableStatement.java:5617)中
在oracle.jdbc.driver.OraclePreparedStatementWrapper.execute(OraclePreparedStatementWrapper.java:1385)
在faidb.faidb.checkSubscription(faidb.java:549)
运行(faidbUI.java:186)
faidb.faidbLogin$3.run(faidbLogin.java:133)
在java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:311)中
我不知所措,我尝试了grant措辞的所有可能组合,所有大写、所有小写、单引号、双引号,以及模式所有者名称前缀C###FAI#u code.FAI#u ADMIN_PKG
,没有FAI#u ADMIN_PKG
,任何东西都不允许这个新用户执行包
我已经在这个项目上花费了相当长的时间,几乎没有人能够使用它
问题:
为什么我新创建的用户在被授予权限后不能执行包
编辑:
我在调用rset.close()的最后一行得到一个NullPointerException
,结果集从未初始化,但它不会抛出SQLException
public Vector<String> fillBox() throws SQLException, NullPointerException{
CallableStatement callStatement = null;
ResultSet rset = null;
String fillBox = "{call fai_admin_pkg.get_end_item_pn(?)}";
Vector<String> boxFill = new Vector<>();
try{
callStatement = conn.prepareCall(fillBox);
callStatement.registerOutParameter(1, OracleTypes.CURSOR);
callStatement.execute();
rset = (ResultSet) callStatement.getObject(1);
boxFill = buildRsVector(rset);
}
finally{
callStatement.close();
rset.close();
}
return boxFill;
}
public Vector fillBox()抛出SQLException、NullPointerException{
CallableStatement callStatement=null;
ResultSet-rset=null;
字符串fillBox=“{调用fai_admin_pkg.get_end_item_pn(?)}”;
向量boxFill=新向量();
试一试{
callStatement=conn.prepareCall(填充框);
registerOutParameter(1,OracleTypes.CURSOR);
callStatement.execute();
rset=(ResultSet)callStatement.getObject(1);
boxFill=构建向量(rset);
}
最后{
callStatement.close();
rset.close();
}
返回框填充;
}
这里称之为:
Vector<String> boxFill = new Vector<>();
try{
boxFill = uiInst.fillBox();
}catch(SQLException e){
JOptionPane.showMessageDialog(frame, e.getMessage());
}catch(NullPointerException e){
JOptionPane.showMessageDialog(frame, e.getMessage());
e.printStackTrace();
}
Vector boxFill=new Vector();
试一试{
boxFill=uiInst.fillBox();
}捕获(SQLE异常){
showMessageDialog(frame,e.getMessage());
}捕获(NullPointerException e){
showMessageDialog(frame,e.getMessage());
e、 printStackTrace();
}
以下是我作为新用户的权限…其中不包括在包上执行??我不明白
问题已解决。如果没有为包所有者设置新用户会话的全局同义词集或当前\u架构
,则会导致对所有者程序的任何调用都需要所有者前缀:。
。我在新用户下进行的调用只是对
的调用,导致抛出SQLException
,因为编译器不存在该包
此外,我将研究全局同义词和用户会话,以避免使用此快速修复
谢谢你的帮助 创建会话只允许您登录数据库。
你可能需要别人的许可才能做你想做的事
您可以参考此链接获取帮助
您能在SQL*Plus中执行所有操作并将结果发布到此处吗?这将有助于排除任何Java问题。抛出的异常都来自sql,因此我假设这是一个数据库问题。我调试了我的java代码,以找出在第一次调用包过程时引发问题的确切位置。一个来自SQL*Plus的工作调用的示例作为新用户登录肯定会有所帮助。正如您用来调用过程(或函数?)的实际Java代码一样,Oracle强烈反对使用#sign-in unquoted标识符这一事实使得用户名的选择有问题。发布查询特定对象名称
、所有者
和p的dba\u源
的结果