源代码如下:
 conn.setAutoCommit(false);
 //pstmt = conn.prepareStatement("GRANT DBA TO TESTUSER");                       1
 //pstmt = conn.pretpareStaement("insert into MYDATABASE.WORKER values(?,?)");   2
 pstmt = conn.prepareStatement("grant ? to ? ");                               //3
 pstmt.setString(1, "ALTER ANY INDEX");
 pstmt.setString(2, "TESTUSER");
 pstmt.addBatch();
 pstmt.executeBatch();
 conn.commit();其中1、2语句都可正确执行,3语句就会报错,所用数据库为oracle,连接池为c3p0,不知道是不是batch语句的格式有什么限制。请指教。错误如下:
java.sql.BatchUpdateException: ORA-00990: 缺少或无效权限 at oracle.jdbc.dbaccess.DBError.throwBatchUpdateException(DBError.java:460)
at oracle.jdbc.driver.OraclePreparedStatement.executeBatch(OraclePreparedStatement.java:4210)
at com.mchange.v2.sql.filter.FilterPreparedStatement.executeBatch(FilterPreparedStatement.java:260)
at database.dao.view.Dba_Users_DAO.executeGrantRolesClauseTest(Dba_Users_DAO.java:377)
at database.dao.view.Dba_Users_DAO.main(Dba_Users_DAO.java:359)

解决方案 »

  1.   

    3 参数传递过去后变成了: grant "ALTER ANY INDEX" to "TESTUSER"
      

  2.   

    是说引号的问题么,在sqlplus中将引号去掉是可以的。那如果我想实现的是赋予一个随机指定的用户N个权限,想用批处理的话,应该如何实现呢?
      

  3.   

    不是引号的问题吧,又试了试:
     pstmt.setString(1, "DBA");
     pstmt.setString(2, "TESTUSER");
    这样也不行,而在sqlplus中是可以的。
      

  4.   

    你建立连接使用的用户的权限是否有grant权限?
      

  5.   

    看来应该是楼上所说。连接的用户不具有grant权限。你在sqlplus用同样用户可以?
      

  6.   

    setString的结果是将根据你的数据库类型针对字段值增加'或者"号,请验证一下.
    要真是这样的话,看来你只能采取+号的方式进行连接了.
      

  7.   

    连接用户为DBA,是具备grant权限的否则语句1不会成功
    pstmt = conn.prepareStatement("GRANT DBA TO TESTUSER");       1
    在sqlplus中也能成功执行。
    数据库中数据类型均为varchar2,而且即使加上引号,无论是"还是'
    pstmt.setString(1, "DBA")中DBA为大写,所以应该也能识别,
    sqlplus中已经验证过了。至于楼上说得+号连接字符串的方法,我已经考虑
    过了,但是因为赋予role时,每个role后面可能加上with admin option 所以将
    多个role连接起来一起赋予用户的sql语句我没有想出来。
    难道只能用statement的批处理才行吗。那样好像效率不高吧。
      

  8.   

    参数位置的限制问题吧,你写个insert into values();把insert用?代替试试看。估计不行
      

  9.   

    一般预处理中
    ?是替换参数的,不是象你写的那样直接是string的替换把?
      

  10.   

    连接oracle用户操作权限的问题,试试把DBA的权限加给此用户试试
      

  11.   

    David_1981() 谢谢,正解,按你说的做报了这个错,果然是参数位置的限制。给分了
    java.sql.BatchUpdateException: ORA-00900: 无效 SQL 语句