2015-05-14 71 views
3

我花了幾個月的時間開發一個帶有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 SESSIONGRANT 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,什麼都不會允許這種新用戶執行包。

我在這個項目上花了相當多的時間,並且驚慌地發現沒有人能夠使用它。

問:

爲什麼不能爲我的新用戶被授予的權限後執行一個包?

編輯:

我得到了與調用最後一行NullPointerExceptionrset.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(); 
      } 

這裏是我作爲新用戶的權限......哪些不包括執行包?我不理解 no permission after granted

+1

可以執行所有的SQL * Plus的行動並張貼在這裏的結果?這將有助於排除任何Java問題。 –

+0

我創建了用戶並授予了SQL plus權限。拋出的異常都來自sql,所以我認爲它是一個數據庫問題。我調試了我的java代碼,找出問題的確切位置 – corporateWhore

+0

第一次調用程序包過程時拋出它 – corporateWhore

回答

2

問題解決了。沒有設置全局同義詞或設置爲包所有者的新用戶會話的current_schema會導致需要所有者前綴的所有者包過程調用:<package owner>.<package>.<procedure>。我在新用戶下進行的調用僅限於<package>.<procedure>,導致SQLException被拋出,因爲編譯器該包不存在。

此外,我將研究全局同義詞和用戶會話,以避免使用此快速修復程序。

感謝您的幫助!