如何使用 jdbc oracle 插入和选择全局临时表? [复制]
Posted
技术标签:
【中文标题】如何使用 jdbc oracle 插入和选择全局临时表? [复制]【英文标题】:How to insert and select global temporary table using jdbc oracle? [duplicate] 【发布时间】:2019-02-22 11:23:14 【问题描述】: String query = "INSERT INTO St (id) values ('Admin'); " +
"select * from Student where id in (select id from St);";
如果尝试执行上述查询会出错
Exception in thread "main" java.sql.SQLSyntaxErrorException: ORA-00933: SQL command not properly ended
at oracle.jdbc.driver.T4CTTIoer11.processError(T4CTTIoer11.java:494)
at oracle.jdbc.driver.T4CTTIoer11.processError(T4CTTIoer11.java:446)
at oracle.jdbc.driver.T4C8Oall.processError(T4C8Oall.java:1054)
at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:623)
at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:252)
at oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:612)
at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:226)
at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:59)
at oracle.jdbc.driver.T4CPreparedStatement.executeForRows(T4CPreparedStatement.java:910)
at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1119)
at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3780)
at oracle.jdbc.driver.T4CPreparedStatement.executeInternal(T4CPreparedStatement.java:1343)
at oracle.jdbc.driver.OraclePreparedStatement.executeQuery(OraclePreparedStatement.java:3822)
at oracle.jdbc.driver.OraclePreparedStatementWrapper.executeQuery(OraclePreparedStatementWrapper.java:1165)
at com.prototype.service.DBConnection.main(DBConnection.java:167)
原因:错误:933,位置:36,Sql = INSERT INTO St (id) 值('管理员'); select * from Student where id in (select id from St);, OriginalSql = INSERT INTO St (id) values ('Admin');选择 * from Student where id in (select id from St);, Error Msg = ORA-00933: SQL 命令未正确结束
【问题讨论】:
您是如何在连接中启用多语句的? 末尾有额外的;
。您需要删除
你不能一次发送两条语句,你需要两次调用,一个用于插入,一个用于查询。 (不过,您为什么想要/需要示例中的 GTT 并不明显。)
我没有在preparedStatement中启用allowMultiQueries,并且我删除了最后的分号(;)仍然面临着理智的问题。
这只是一个例子
【参考方案1】:
您可以使用插入选择语句,这样可以避免多语句查询
String query = "INSERT INTO St (id)
select your_col_for_id from Student where id in (select id from St);";
您必须确保在 into 子句和 select 子句中有相应数量和类型的列
【讨论】:
我已经通过使用批处理实现了,我为插入查询和executeBatch添加了批处理。以上是关于如何使用 jdbc oracle 插入和选择全局临时表? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
使用 JDBC 连接在 Oracle 过程可调用语句中插入对象的 ArrayList 作为参数
如何优化 Oracle 11g 和 Hibernate 的批量插入?