我花了几个月的时间开发一个带有 Oracle 数据库后端的 JAVA 应用程序。我使用 Netbeans 作为我的 IDE,并在笔记本电脑上使用 Oracle 12c 作为我的数据库。所有 PL/SQL 均已编译,没有错误。
经过广泛的测试(以架构所有者身份登录),我尝试添加用户。我创建了用户,以 SYS_DBA 身份登录,使用CREATE USER E566299 IDENTIFIED BY tempPswrd
,然后使用授予权限GRANT CREATE SESSION
and GRANT EXECUTE ON C##FAI_CODE.FAI_ADMIN_PKG TO E566299
并收到Grant succeeded
确认。
我以新用户身份登录我的应用程序,使用以下命令没有出现任何错误:
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_ADMIN_PKG.CHECK_USER_FOLLOWED”
ORA-06550: 第 1 行,第 7 列:
PL/SQL:语句被忽略
在 oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:450)
在 oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.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)
在 faidb.faidbUI.run(faidbUI.java:186)
在 faidb.faidbLogin$3.run(faidbLogin.java:133)
在 java.awt.event.InvocableEvent.dispatch(InvocableEvent.java:311)
我不知所措,我尝试了授予措辞、全部大写、全部小写、单引号、双引号以及模式所有者名称前缀的所有可能组合C##FAI_CODE.FAI_ADMIN_PKG
, 没有FAI_ADMIN_PKG
,没有任何东西可以允许这个新用户执行该包。
我在这个项目上花费了相当多的时间,并且对没有人能够使用它感到恐慌。
问题:
为什么我新创建的用户获得权限后无法执行包?
Edit:
I get a NullPointerException
在最后一行调用rset.close();
,结果集从未初始化,但它不会抛出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;
}
这就是这里所说的:
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();
}
Here are my permissions as the new user...which do not include execute on the package?? I'm not understanding