源代码如下:
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)
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)
pstmt.setString(1, "DBA");
pstmt.setString(2, "TESTUSER");
这样也不行,而在sqlplus中是可以的。
要真是这样的话,看来你只能采取+号的方式进行连接了.
pstmt = conn.prepareStatement("GRANT DBA TO TESTUSER"); 1
在sqlplus中也能成功执行。
数据库中数据类型均为varchar2,而且即使加上引号,无论是"还是'
pstmt.setString(1, "DBA")中DBA为大写,所以应该也能识别,
sqlplus中已经验证过了。至于楼上说得+号连接字符串的方法,我已经考虑
过了,但是因为赋予role时,每个role后面可能加上with admin option 所以将
多个role连接起来一起赋予用户的sql语句我没有想出来。
难道只能用statement的批处理才行吗。那样好像效率不高吧。
?是替换参数的,不是象你写的那样直接是string的替换把?
java.sql.BatchUpdateException: ORA-00900: 无效 SQL 语句