java.sql.SQLException : ORA-06550: line 1, 第 13 列:授予用户对 EXECUTE 包的权限后

标签 java user-interface jdbc oracle12c

我花了几个月的时间开发一个带有 Oracle 数据库后端的 JAVA 应用程序。我在笔记本电脑上使用 Netbeans 作为我的 IDE,并使用 Oracle 12c 作为我的数据库。所有 PL/SQL 都已编译,没有错误。

经过大量测试(以架构所有者身份登录)后,我尝试添加一个用户。我创建了用户,以 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: line 1, column 13: PLS-00201: identifier 'FAI_ADMIN_PKG.CHECK_USER_FOLLOWED' must be declared ORA-06550: line 1, column 7: PL/SQL: Statement ignored

at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:450) at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:399) at 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) at oracle.jdbc.driver.T4CCallableStatement.doOall8(T4CCallableStatement.java:210) at oracle.jdbc.driver.T4CCallableStatement.doOall8(T4CCallableStatement.java:53) at oracle.jdbc.driver.T4CCallableStatement.executeForRows(T4CCallableStatement.java:938) at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1075) at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3820) at oracle.jdbc.driver.OraclePreparedStatement.execute(OraclePreparedStatement.java:3923) at oracle.jdbc.driver.OracleCallableStatement.execute(OracleCallableStatement.java:5617) at oracle.jdbc.driver.OraclePreparedStatementWrapper.execute(OraclePreparedStatementWrapper.java:1385) at faidb.FAIdb.checkSubscription(FAIdb.java:549) at faidb.faidbUI.run(faidbUI.java:186) at faidb.faidbLogin$3.run(faidbLogin.java:133) at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:311)

我不知所措,我尝试了所有可能的授权措辞组合,全部大写,全部小写,单引号,双引号,模式所有者名称前缀 C##FAI_CODE.FAI_ADMIN_PKG,没有 FAI_ADMIN_PKG,这个新用户将无法执行包。

我在这个项目上花费了相当多的时间,并且几乎 panic ,因为没有人能够使用它。

问题:

为什么我新创建的用户被授予权限后不能执行包?

编辑:

我在调用 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;
    }

这里调用的是:

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

最佳答案

问题解决了。没有全局同义词集或 current_schema将新用户的 session 设置为包所有者会导致对需要所有者前缀的所有者包过程的任何调用:<package owner>.<package>.<procedure> .我在新用户下打的电话只打给了<package>.<procedure>导致 SQLException被抛出是因为编译器认为该包不存在。

此外,我将研究全局同义词和用户 session 以避免必须使用此快速修复。

感谢您的帮助!

关于java.sql.SQLException : ORA-06550: line 1, 第 13 列:授予用户对 EXECUTE 包的权限后,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30249225/

相关文章:

java - Android - 如何接听 Skype/VoIP 电话?

java - 如何在 Hibernate 中禁用连接池

user-interface - 我如何通过浏览器从测试到使用 Arquillian Drone 和 Graphene 进行测试

java - 在由 Maven 驱动的简单演示应用程序的 JAR 中包含 Postgres 的 JDBC 驱动程序

kotlin - 如何在 Kotlin 协程中使用阻塞(I/O 绑定(bind))API?

java - JDBC 准备语句语法错误

java - 无法构造 `com.test.FilterModel` 的实例。没有可从字符串值反序列化的字符串参数构造函数/工厂方法

java - response.setContentType() 在 Java Filter 中重置

java - 如何在Java中居中一个窗口?

user-interface - 为 GDB 编写前端