From d62678a036866e38d18c692a315c2fc58c26d340 Mon Sep 17 00:00:00 2001 From: ulleo Date: Fri, 11 Apr 2025 18:54:06 +0800 Subject: [PATCH] =?UTF-8?q?feat(X-Pack):=20[=E6=95=B0=E6=8D=AE=E5=A1=AB?= =?UTF-8?q?=E6=8A=A5]=E6=94=AF=E6=8C=81Oracle=E7=9A=84CLOB=E5=AD=97?= =?UTF-8?q?=E6=AE=B5=E7=B1=BB=E5=9E=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../datasource/provider/CalciteProvider.java | 36 ++++++++++++++++--- 1 file changed, 32 insertions(+), 4 deletions(-) diff --git a/core/core-backend/src/main/java/io/dataease/datasource/provider/CalciteProvider.java b/core/core-backend/src/main/java/io/dataease/datasource/provider/CalciteProvider.java index 1ac5585d47..4cc0a512c4 100644 --- a/core/core-backend/src/main/java/io/dataease/datasource/provider/CalciteProvider.java +++ b/core/core-backend/src/main/java/io/dataease/datasource/provider/CalciteProvider.java @@ -38,6 +38,8 @@ import org.springframework.stereotype.Component; import java.io.File; import java.io.IOException; +import java.io.Reader; +import java.io.StringReader; import java.math.BigDecimal; import java.net.URL; import java.sql.*; @@ -480,7 +482,12 @@ public class CalciteProvider extends Provider { valueObject = new String(((String) valueObject).getBytes(datasourceConfiguration.getTargetCharset()), datasourceConfiguration.getCharset()); } } - ((PreparedStatement) statement).setObject(i + 1, valueObject, datasourceRequest.getTableFieldWithValues().get(i).getType()); + if (valueObject instanceof String && datasourceRequest.getTableFieldWithValues().get(i).getType().equals(Types.CLOB) && DatasourceConfiguration.DatasourceType.valueOf(value.getType()) == DatasourceConfiguration.DatasourceType.oracle) { + Reader reader = new StringReader((String) valueObject); + ((PreparedStatement) statement).setCharacterStream(i + 1, reader, ((String) valueObject).length()); + } else { + ((PreparedStatement) statement).setObject(i + 1, valueObject, datasourceRequest.getTableFieldWithValues().get(i).getType()); + } LogUtil.info("execWithPreparedStatement param[" + (i + 1) + "](" + datasourceRequest.getTableFieldWithValues().get(i).getColumnTypeName() + "): " + datasourceRequest.getTableFieldWithValues().get(i).getValue()); } catch (SQLException e) { throw new SQLException(e.getMessage() + ". VALUE: " + datasourceRequest.getTableFieldWithValues().get(i).getValue().toString() + " , TARGET TYPE: " + datasourceRequest.getTableFieldWithValues().get(i).getColumnTypeName()); @@ -541,7 +548,12 @@ public class CalciteProvider extends Provider { valueObject = new String(((String) valueObject).getBytes(datasourceConfiguration.getTargetCharset()), datasourceConfiguration.getCharset()); } } - ((PreparedStatement) statement).setObject(i + 1, valueObject, datasourceRequest.getTableFieldWithValues().get(i).getType()); + if (valueObject instanceof String && datasourceRequest.getTableFieldWithValues().get(i).getType().equals(Types.CLOB) && DatasourceConfiguration.DatasourceType.valueOf(value.getType()) == DatasourceConfiguration.DatasourceType.oracle) { + Reader reader = new StringReader((String) valueObject); + ((PreparedStatement) statement).setCharacterStream(i + 1, reader, ((String) valueObject).length()); + } else { + ((PreparedStatement) statement).setObject(i + 1, valueObject, datasourceRequest.getTableFieldWithValues().get(i).getType()); + } LogUtil.info("execWithPreparedStatement param[" + (i + 1) + "](" + datasourceRequest.getTableFieldWithValues().get(i).getColumnTypeName() + "): " + datasourceRequest.getTableFieldWithValues().get(i).getValue()); } catch (SQLException e) { throw new SQLException(e.getMessage() + ". VALUE: " + datasourceRequest.getTableFieldWithValues().get(i).getValue().toString() + " , TARGET TYPE: " + datasourceRequest.getTableFieldWithValues().get(i).getColumnTypeName()); @@ -599,7 +611,12 @@ public class CalciteProvider extends Provider { valueObject = new String(((String) valueObject).getBytes(datasourceConfiguration.getTargetCharset()), datasourceConfiguration.getCharset()); } } - ((PreparedStatement) statement).setObject(i + 1, valueObject, datasourceRequest.getTableFieldWithValues().get(i).getType()); + if (valueObject instanceof String && datasourceRequest.getTableFieldWithValues().get(i).getType().equals(Types.CLOB) && DatasourceConfiguration.DatasourceType.valueOf(value.getType()) == DatasourceConfiguration.DatasourceType.oracle) { + Reader reader = new StringReader((String) valueObject); + ((PreparedStatement) statement).setCharacterStream(i + 1, reader, ((String) valueObject).length()); + } else { + ((PreparedStatement) statement).setObject(i + 1, valueObject, datasourceRequest.getTableFieldWithValues().get(i).getType()); + } LogUtil.info("execWithPreparedStatement param[" + (i + 1) + "](" + datasourceRequest.getTableFieldWithValues().get(i).getColumnTypeName() + "): " + datasourceRequest.getTableFieldWithValues().get(i).getValue()); } catch (SQLException e) { throw new SQLException(e.getMessage() + ". VALUE: " + datasourceRequest.getTableFieldWithValues().get(i).getValue().toString() + " , TARGET TYPE: " + datasourceRequest.getTableFieldWithValues().get(i).getColumnTypeName()); @@ -663,9 +680,13 @@ public class CalciteProvider extends Provider { private List getData(ResultSet rs, DatasourceRequest datasourceRequest) throws Exception { String targetCharset = null; + String originCharset = null; if (datasourceRequest != null && datasourceRequest.getDatasource().getType().equalsIgnoreCase("oracle")) { DatasourceConfiguration jdbcConfiguration = JsonUtil.parseObject(datasourceRequest.getDatasource().getConfiguration(), DatasourceConfiguration.class); + if (StringUtils.isNotEmpty(jdbcConfiguration.getCharset())) { + originCharset = jdbcConfiguration.getCharset(); + } if (StringUtils.isNotEmpty(jdbcConfiguration.getTargetCharset())) { targetCharset = jdbcConfiguration.getTargetCharset(); } @@ -694,7 +715,14 @@ public class CalciteProvider extends Provider { if (metaData.getColumnTypeName(j + 1).toLowerCase().equalsIgnoreCase("blob")) { row[j] = rs.getBlob(j + 1) == null ? "" : rs.getBlob(j + 1).toString(); } - if (targetCharset != null && StringUtils.isNotEmpty(rs.getString(j + 1)) && (columnType != Types.NVARCHAR && columnType != Types.NCHAR)) { + if (targetCharset != null && StringUtils.isNotEmpty(rs.getString(j + 1)) && columnType == Types.CLOB) { + Clob c = rs.getClob(j + 1); + if (originCharset == null) { + row[j] = new String((c.getSubString(1, (int) c.length())).getBytes(), targetCharset); + } else { + row[j] = new String((c.getSubString(1, (int) c.length())).getBytes(originCharset), targetCharset); + } + } else if (targetCharset != null && StringUtils.isNotEmpty(rs.getString(j + 1)) && (columnType != Types.NVARCHAR && columnType != Types.NCHAR)) { row[j] = new String(rs.getBytes(j + 1), targetCharset); } else { row[j] = rs.getString(j + 1);