急:Java调用Oracle执行SQL:ORA-00911: 无效字符

幽谷无魂 2009-12-24 03:43:25
开发语言:Java
数据库:Oracle 10g
问题:在Java代码中,有三个SQL需要执行,1个是INSERT,1个是UPDATE,另一个是DELETE,我使用分号(;)将三个SQL连接起来,然后将其执行
con.prepareStatement(allSQL.toString()).execute();

但会报如下错误:

java.sql.SQLException: ORA-00911: 无效字符

at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:134)
at oracle.jdbc.ttc7.TTIoer.processError(TTIoer.java:289)
at oracle.jdbc.ttc7.Oall7.receive(Oall7.java:573)
at oracle.jdbc.ttc7.TTC7Protocol.doOall7(TTC7Protocol.java:1891)
at oracle.jdbc.ttc7.TTC7Protocol.parseExecuteFetch(TTC7Protocol.java:1093)
at oracle.jdbc.driver.OracleStatement.executeNonQuery(OracleStatement.java:2047)
at oracle.jdbc.driver.OracleStatement.doExecuteOther(OracleStatement.java:1940)
at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:2709)
at oracle.jdbc.driver.OraclePreparedStatement.executeUpdate(OraclePreparedStatement.java:589)
at oracle.jdbc.driver.OraclePreparedStatement.execute(OraclePreparedStatement.java:656)
at org.apache.commons.dbcp.DelegatingPreparedStatement.execute(DelegatingPreparedStatement.java:168)
at com.ebest.pg.dao.VisitDao.addVisitMsg(VisitDao.java:452)
at com.ebest.pg.service.VisitMsgService.addVisitMsg_tran(VisitMsgService.java:222)
at com.ebest.pg.service.VisitMsgService.doService(VisitMsgService.java:25)
at com.ebest.pg.servlet.ServletApp.doService(ServletApp.java:161)
at com.ebest.pg.servlet.ServletApp.doPost(ServletApp.java:72)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:709)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:237)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:214)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
at org.apache.catalina.core.StandardContextValve.invokeInternal(StandardContextValve.java:198)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:152)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:137)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:118)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:102)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:929)
at org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:160)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:799)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:705)
at org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java:577)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:683)
at java.lang.Thread.run(Thread.java:595)



我保证每个SQL语句都能单独在SQL Plus中正常执行的。
...全文
1991 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
mapleting 2012-08-16
  • 打赏
  • 举报
回复
在java里面执行sql语句的时候是千万不能出现;,一旦出现这个肯定会报无效字符的,
三条语句,要么用批处理的方法,要么,就分三次pre.execute();来执行。
当然了,存储过程是首选,三种方法,存储过程的效率是最高的。
萧湘易水寒 2011-03-19
  • 打赏
  • 举报
回复
String sql = "ALTER TABLE emp ADD (photo Clob) ;";
ConnHelper connHelper = new ConnHelper();
try {
System.out.println(sql);
int create = connHelper.modifyDb(sql);
if (create > 0) {
System.out.println("success add column!");
}


我的是单选sql也报呀,而且是经常报,不知道为什么,sql语句我是先在plsql中执行成功后copy来的,oracle 11 ????
幽谷无魂 2009-12-25
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 crazylaa 的回复:]
jdbc的纯sql不能用;的,3个要分3条来执行,或者采用oracle的匿名块来做,简单修改下就可以:
要求你的3条sql后面都有分号
con.prepareStatement("begin "+allSQL.toString()+" end;").execute();
[/Quote]

MS不行啊

// 从连接池中获取一个空闲的连接
con = dbPool.getSqlConn();
// 设置事务模式为非自动提交
con.setAutoCommit(false);
// 设置事务锁模式
con.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);
.
.
.
flag = con.prepareStatement("BEGIN " + allSQL.toString() + " END;").execute();

if (flag) {
con.commit();
} else {
con.rollback();
}
幽谷无魂 2009-12-25
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 zl3450341 的回复:]
不能把sql语句连接起来放到一个prepareStatement里面
看看9楼给你的代码
[/Quote]

MS不行啊

// 从连接池中获取一个空闲的连接
con = dbPool.getSqlConn();
// 设置事务模式为非自动提交
con.setAutoCommit(false);
// 设置事务锁模式
con.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);
.
.
.
flag = con.prepareStatement("BEGIN " + allSQL.toString() + " END;").execute();

if (flag) {
con.commit();
} else {
con.rollback();
}
crazylaa 2009-12-24
  • 打赏
  • 举报
回复
jdbc的纯sql不能用;的,3个要分3条来执行,或者采用oracle的匿名块来做,简单修改下就可以:
要求你的3条sql后面都有分号
con.prepareStatement("begin "+allSQL.toString()+" end;").execute();
zl3450341 2009-12-24
  • 打赏
  • 举报
回复
不能把sql语句连接起来放到一个prepareStatement里面
看看9楼给你的代码
luckydog1 2009-12-24
  • 打赏
  • 举报
回复
commit?
2到20个英文 2009-12-24
  • 打赏
  • 举报
回复
@param sql any SQL statement 任何 SQL 语句
我想那样写就不对了
2到20个英文 2009-12-24
  • 打赏
  • 举报
回复

/**
* Executes the given SQL statement, which may return multiple results.
* In some (uncommon) situations, a single SQL statement may return
* multiple result sets and/or update counts. Normally you can ignore
* this unless you are (1) executing a stored procedure that you know may
* return multiple results or (2) you are dynamically executing an
* unknown SQL string.
* <P>
* The <code>execute</code> method executes an SQL statement and indicates the
* form of the first result. You must then use the methods
* <code>getResultSet</code> or <code>getUpdateCount</code>
* to retrieve the result, and <code>getMoreResults</code> to
* move to any subsequent result(s).
*
* @param sql any SQL statement
* @return <code>true</code> if the first result is a <code>ResultSet</code>
* object; <code>false</code> if it is an update count or there are
* no results
* @exception SQLException if a database access error occurs
* @see #getResultSet
* @see #getUpdateCount
* @see #getMoreResults
*/
boolean execute(String sql) throws SQLException;


如果楼主想一次调完,我建议还是写 存储过程

道光2008 2009-12-24
  • 打赏
  • 举报
回复
con.prepareStatement(allSQL.toString()).execute();
这样当然不行,3条语句只能用批处理:
pre=con.createStatement();
pre.addBatch(sql1);
pre.addBatch(sql2);
pre.addBatch(sql3);
或者
con.prepareStatement(sql1).execute();
con.prepareStatement(sql2).execute();
con.prepareStatement(sql3).execute();
2到20个英文 2009-12-24
  • 打赏
  • 举报
回复
其实这样操作我还没试过,以前项目中,在ibatis中用 ; 就报的无效字符
2到20个英文 2009-12-24
  • 打赏
  • 举报
回复
我知道在Oracle客户端软件中操作是可以了

但java 对sql 语句进行了封装,里面可不可以操作这么多?或是不是用;格开
你可以看下源码

「已注销」 2009-12-24
  • 打赏
  • 举报
回复
上数据库里试试行不
幽谷无魂 2009-12-24
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 hedangqing 的回复:]
能一下操作这么多吗

不如写个存储过程吧
[/Quote]

我在程序中将要执行的SQL(是指用分号连接好了的SQL)打印出来,再拷到Toad for Oracle 9.5(这是一个Oracle客户端软件)中按'F5'键执行是可以成功的,但按'F9'也会报“ORA-00911: 无效字符”这个错
应该可以这么写的,但我不知道在Java中为什么会报错
幽谷无魂 2009-12-24
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 dong502 的回复:]
表没有吧
[/Quote]

我能保证SQL执行成功,那又何来没有表呢?
2到20个英文 2009-12-24
  • 打赏
  • 举报
回复
能一下操作这么多吗

不如写个存储过程吧
2到20个英文 2009-12-24
  • 打赏
  • 举报
回复
无效字符是指不能用;吧
dong502 2009-12-24
  • 打赏
  • 举报
回复
表没有吧

67,512

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧