我花了幾個月的時間開發一個帶有Oracle數據庫後端的JAVA應用程序。我在筆記本電腦上使用Netbeans作爲我的IDE和Oracle 12c作爲我的數據庫。所有PL/SQL都已經編譯完成,沒有錯誤。java.sql.SQLException:ORA-06550:第1行,第13列:授予EXECUTE包的用戶權限
經過大量測試(以架構所有者身份登錄)後,我試圖添加一個用戶。我創建了用戶,以SYS_DBA身份登錄,使用CREATE USER E566299 IDENTIFIED BY tempPswrd
,然後授予使用GRANT CREATE SESSION
和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) at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:655) at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:249) at oracle.jdbc.driver。 T4C8Oall.doOALL(T4C8Oall.java:566) 在oracle.jdbc.driver.T4CCallableStatement.doOall8(T4CCallableStatement.java:210) 在oracle.jdbc.driver.T4CCallableStatement.doOall8(T4CCallableStatement.java:53) 甲骨文。 jdbc.driver.T4CCallableStatement.executeForRows(T4CCallableStatement.java:938) at oracl在oracle.jdbc.driver.OraclePreparedStatement.execute(OraclePreparedStatement.java:oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3820) 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.InvocationEvent.dispatch(InvocationEvent.java:311)
我不知所措,我已經試過補助措辭,全部大寫,全部小寫,單引號,雙引號,與模式所有者名稱前綴C##FAI_CODE.FAI_ADMIN_PKG
的每一個可能的組合,沒有FAI_ADMIN_PKG
,什麼都不會允許這種新用戶執行包。
我在這個項目上花了相當多的時間,並且驚慌地發現沒有人能夠使用它。
問:
爲什麼不能爲我的新用戶被授予的權限後執行一個包?
編輯:
我得到了與調用最後一行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();
}
這裏是我作爲新用戶的權限......哪些不包括執行包?我不理解
可以執行所有的SQL * Plus的行動並張貼在這裏的結果?這將有助於排除任何Java問題。 –
我創建了用戶並授予了SQL plus權限。拋出的異常都來自sql,所以我認爲它是一個數據庫問題。我調試了我的java代碼,找出問題的確切位置 – corporateWhore
第一次調用程序包過程時拋出它 – corporateWhore