From 791ba35ba0dab9769a8fe644912d5fe8f6063fd9 Mon Sep 17 00:00:00 2001 From: Looly Date: Fri, 26 May 2023 22:27:33 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8DSqlExecutor.execute=E6=89=A7?= =?UTF-8?q?=E8=A1=8CORACLE=20insert=20into=20select=E6=8A=A5ORA-00933?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 1 + .../main/java/cn/hutool/db/StatementUtil.java | 17 ++++++++++++++++- .../main/java/cn/hutool/db/sql/SqlExecutor.java | 6 +++--- 3 files changed, 20 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0c8f7b91b0..29fc845fb4 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -32,6 +32,7 @@ * 【cron 】 修复SystemTimer无法结束进程问题(issue#3090@Github) * 【core 】 修复BeanUtil.copyToList复制Long等类型错误问题(issue#3091@Github) * 【poi 】 修复MapRowHandler结果Map无序问题(issue#I71SE8@Github) +* 【db 】 修复SqlExecutor.execute执行ORACLE insert into select报ORA-00933问题(issue#I778U7@Github) ------------------------------------------------------------------------------------------------------------- # 5.8.18 (2023-04-27) diff --git a/hutool-db/src/main/java/cn/hutool/db/StatementUtil.java b/hutool-db/src/main/java/cn/hutool/db/StatementUtil.java index b821c819e6..27552bce5f 100644 --- a/hutool-db/src/main/java/cn/hutool/db/StatementUtil.java +++ b/hutool-db/src/main/java/cn/hutool/db/StatementUtil.java @@ -124,6 +124,21 @@ public static PreparedStatement prepareStatement(Connection conn, String sql, Co * @since 3.2.3 */ public static PreparedStatement prepareStatement(Connection conn, String sql, Object... params) throws SQLException { + return prepareStatement(GlobalDbConfig.returnGeneratedKey, conn, sql, params); + } + + /** + * 创建{@link PreparedStatement} + * + * @param returnGeneratedKey 当为insert语句时,是否返回主键 + * @param conn 数据库连接 + * @param sql SQL语句,使用"?"做为占位符 + * @param params "?"对应参数列表 + * @return {@link PreparedStatement} + * @throws SQLException SQL异常 + * @since 5.8.19 + */ + public static PreparedStatement prepareStatement(boolean returnGeneratedKey, Connection conn, String sql, Object... params) throws SQLException { Assert.notBlank(sql, "Sql String must be not blank!"); sql = sql.trim(); @@ -136,7 +151,7 @@ public static PreparedStatement prepareStatement(Connection conn, String sql, Ob SqlLog.INSTANCE.log(sql, ArrayUtil.isEmpty(params) ? null : params); PreparedStatement ps; - if (GlobalDbConfig.returnGeneratedKey && StrUtil.startWithIgnoreCase(sql, "insert")) { + if (returnGeneratedKey && StrUtil.startWithIgnoreCase(sql, "insert")) { // 插入默认返回主键 ps = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS); } else { diff --git a/hutool-db/src/main/java/cn/hutool/db/sql/SqlExecutor.java b/hutool-db/src/main/java/cn/hutool/db/sql/SqlExecutor.java index eb19816ddc..fe9a6dde04 100755 --- a/hutool-db/src/main/java/cn/hutool/db/sql/SqlExecutor.java +++ b/hutool-db/src/main/java/cn/hutool/db/sql/SqlExecutor.java @@ -54,7 +54,7 @@ public static int execute(Connection conn, String sql, Map param public static int execute(Connection conn, String sql, Object... params) throws SQLException { PreparedStatement ps = null; try { - ps = StatementUtil.prepareStatement(conn, sql, params); + ps = StatementUtil.prepareStatement(false, conn, sql, params); return ps.executeUpdate(); } finally { DbUtil.close(ps); @@ -128,7 +128,7 @@ public static Long executeForGeneratedKey(Connection conn, String sql, Object... PreparedStatement ps = null; ResultSet rs = null; try { - ps = StatementUtil.prepareStatement(conn, sql, params); + ps = StatementUtil.prepareStatement(true, conn, sql, params); ps.executeUpdate(); rs = ps.getGeneratedKeys(); if (rs != null && rs.next()) { @@ -271,7 +271,7 @@ public static T query(Connection conn, SqlBuilder sqlBuilder, RsHandler r public static T query(Connection conn, String sql, RsHandler rsh, Object... params) throws SQLException { PreparedStatement ps = null; try { - ps = StatementUtil.prepareStatement(conn, sql, params); + ps = StatementUtil.prepareStatement(false, conn, sql, params); return executeQuery(ps, rsh); } finally { DbUtil.close(ps);