Sfoglia il codice sorgente

解析Oracle Clob/NClob

穿云 1 mese fa
parent
commit
4e8398e395

+ 1 - 0
dbsyncer-connector/dbsyncer-connector-oracle/src/main/java/org/dbsyncer/connector/oracle/schema/OracleClobValueMapper.java

@@ -12,6 +12,7 @@ import java.nio.charset.StandardCharsets;
  * @version 1.0.0
  * @date 2022/8/25 0:07
  */
+@Deprecated
 public final class OracleClobValueMapper extends AbstractValueMapper<CustomType> {
 
     @Override

+ 1 - 0
dbsyncer-connector/dbsyncer-connector-oracle/src/main/java/org/dbsyncer/connector/oracle/schema/support/OracleBytesType.java

@@ -55,6 +55,7 @@ public final class OracleBytesType extends BytesType {
             if ("EMPTY_BLOB()".equals(s)) {
                 return null;
             }
+            return s.getBytes();
         }
         return super.convert(val, field);
     }

+ 27 - 0
dbsyncer-connector/dbsyncer-connector-oracle/src/main/java/org/dbsyncer/connector/oracle/schema/support/OracleStringType.java

@@ -3,9 +3,16 @@
  */
 package org.dbsyncer.connector.oracle.schema.support;
 
+import oracle.sql.CLOB;
+import org.dbsyncer.connector.oracle.OracleException;
 import org.dbsyncer.sdk.model.Field;
 import org.dbsyncer.sdk.schema.support.StringType;
 
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.Reader;
+import java.nio.charset.StandardCharsets;
+import java.sql.SQLException;
 import java.util.Arrays;
 import java.util.Set;
 import java.util.stream.Collectors;
@@ -46,7 +53,27 @@ public final class OracleStringType extends StringType {
 
     @Override
     protected String merge(Object val, Field field) {
+        if (val instanceof byte[]) {
+            return new String((byte[]) val, StandardCharsets.UTF_8);
+        }
+        if (val instanceof CLOB) {
+            return clobToString((CLOB) val);
+        }
         return throwUnsupportedException(val, field);
     }
 
+    public String clobToString(CLOB clob) {
+        try (Reader is = clob.getCharacterStream(); BufferedReader br = new BufferedReader(is)) {
+            String s = br.readLine();
+            StringBuilder sb = new StringBuilder();
+            while (s != null) {
+                sb.append(s);
+                s = br.readLine();
+            }
+            return sb.toString();
+        } catch (SQLException | IOException e) {
+            throw new OracleException(e);
+        }
+    }
+
 }