From f3e7ed16a33fd148dc039532273f1840311087b7 Mon Sep 17 00:00:00 2001 From: ifooling Date: Tue, 9 Aug 2022 10:32:01 +0800 Subject: [PATCH 1/2] =?UTF-8?q?fix:=E8=A7=A3=E5=86=B3=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E6=BA=90=E4=B8=BAOracle=E6=97=B6=EF=BC=8C@explain=20=E6=8A=A5?= =?UTF-8?q?=E9=94=99=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 解决数据源为Oracle时,使用性能分析关键字 @explain,查询报 "ORA-00922: 选项缺失或无效"问题 issue #432 closes #432 --- APIJSONORM/src/main/java/apijson/orm/AbstractSQLConfig.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/APIJSONORM/src/main/java/apijson/orm/AbstractSQLConfig.java b/APIJSONORM/src/main/java/apijson/orm/AbstractSQLConfig.java index 47674908e..646b7d0d3 100755 --- a/APIJSONORM/src/main/java/apijson/orm/AbstractSQLConfig.java +++ b/APIJSONORM/src/main/java/apijson/orm/AbstractSQLConfig.java @@ -3979,7 +3979,7 @@ public static String getSQL(AbstractSQLConfig config) throws Exception { } return "DELETE FROM " + tablePath + config.getWhereString(true) + (config.isMySQL() ? config.getLimitString() : ""); // PostgreSQL 不允许 LIMIT default: - String explain = (config.isExplain() ? (config.isSQLServer() || config.isOracle() ? "SET STATISTICS PROFILE ON " : "EXPLAIN ") : ""); + String explain = config.isExplain() ? (config.isSQLServer() ? "SET STATISTICS PROFILE ON " : (config.isOracle() ? "EXPLAIN PLAN FOR " : "EXPLAIN ")) : ""; if (config.isTest() && RequestMethod.isGetMethod(config.getMethod(), true)) { // FIXME 为啥是 code 而不是 count ? String q = config.getQuote(); // 生成 SELECT ( (24 >=0 AND 24 <3) ) AS `code` LIMIT 1 OFFSET 0 return explain + "SELECT " + config.getWhereString(false) + " AS " + q + JSONResponse.KEY_COUNT + q + config.getLimitString(); From 8f50678d7ed968ba2a090c0a41b2e1deab73f46e Mon Sep 17 00:00:00 2001 From: ifooling Date: Thu, 11 Aug 2022 18:34:07 +0800 Subject: [PATCH 2/2] =?UTF-8?q?fix:=E8=A7=A3=E5=86=B3=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E6=BA=90=E4=B8=BAOracle=E6=97=B6=EF=BC=8C=E4=BD=BF=E7=94=A8?= =?UTF-8?q?=E8=87=AA=E5=A2=9E=E4=B8=BB=E9=94=AE=EF=BC=8C=E8=8E=B7=E5=8F=96?= =?UTF-8?q?=E4=B8=8D=E5=88=B0=E6=8F=92=E5=85=A5=E7=9A=84=E4=B8=BB=E9=94=AE?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 解决数据源为Oracle时,使用自增主键,获取不到新增后的id问题 报错信息: getLong not implemented for class oracle.jdbc.driver.T4CRowidAccessor issue #338 --- .../src/main/java/apijson/orm/AbstractSQLExecutor.java | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/APIJSONORM/src/main/java/apijson/orm/AbstractSQLExecutor.java b/APIJSONORM/src/main/java/apijson/orm/AbstractSQLExecutor.java index 02cbad747..1da105835 100755 --- a/APIJSONORM/src/main/java/apijson/orm/AbstractSQLExecutor.java +++ b/APIJSONORM/src/main/java/apijson/orm/AbstractSQLExecutor.java @@ -1068,7 +1068,13 @@ public PreparedStatement getStatement(@NotNull SQLConfig config, String sql) thr PreparedStatement statement; //创建Statement对象 if (config.getMethod() == RequestMethod.POST && config.getId() == null) { //自增id - statement = getConnection(config).prepareStatement(sql, Statement.RETURN_GENERATED_KEYS); + if (config.isOracle()) { + // 解决 oracle 使用自增主键 插入获取不到id问题 + String[] generatedColumns = {config.getIdKey()}; + statement = getConnection(config).prepareStatement(sql, generatedColumns); + } else { + statement = getConnection(config).prepareStatement(sql, Statement.RETURN_GENERATED_KEYS); + } } else if (RequestMethod.isGetMethod(config.getMethod(), true)) { statement = getConnection(config).prepareStatement(sql, ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE); @@ -1250,7 +1256,7 @@ public int executeUpdate(@NotNull SQLConfig config, String sql) throws Exception if (config.getId() == null && config.getMethod() == RequestMethod.POST) { // 自增id ResultSet rs = stt.getGeneratedKeys(); if (rs != null && rs.next()) { - config.setId(rs.getLong(1)); //返回插入的主键id FIXME Oracle 拿不到 + config.setId(rs.getLong(1)); } }