Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java.sql.SQLException:ORA-06550:第1行第13列:授予用户执行包的权限后_Java_User Interface_Jdbc_Oracle12c - Fatal编程技术网

java.sql.SQLException:ORA-06550:第1行第13列:授予用户执行包的权限后

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并收到授予成功的确认 我以这个新

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

经过大量测试(以架构所有者身份登录)后,我尝试添加一个用户。我创建了一个用户,以SYS#u DBA的身份登录,使用tempPswrd识别的
创建用户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源
的结果