java oracle clob string 大字符串存储

这几天在在往数据库里更新一个大字符串,忙了好几天终于试出来一个好方法,现在拿出来分享下:
public class ClobTest {

static String url = "jdbc:oracle:thin:@10.12.10.18:1521:orcl";
static String user = "cwbe1_9999";
static String pwd = "or777";
static String text = "这是要插入到CLOB里面的数据,更新数据!" + "update";

private static int clobImport() throws ClassNotFoundException, SQLException {
DriverManager.registerDriver(new OracleDriver());
Connection conn = DriverManager.getConnection(url, user, pwd);// 得到连接对象
String sql = "insert into ETLNEEDPARAM(F_KEY,F_VALUE) values ('defaultpo',?)";// 要执行的SQL语句
PreparedStatement stmt = conn.prepareStatement(sql);// 加载SQL语句
// PreparedStatement支持SQL带有问号?,可以动态替换?的内容。
Reader clobReader = new StringReader(text); // 将 text转成流形式
stmt.setCharacterStream(1, clobReader, text.length());// 替换sql语句中的?
int num = stmt.executeUpdate();// 执行SQL
if (num > 0) {
System.out.println("ok");
} else {
System.out.println("NO");
}
stmt.close();
conn.close();
return num;
}

private static int clobUpdate(String key) throws ClassNotFoundException, SQLException {

DriverManager.registerDriver(new OracleDriver());
Connection conn = DriverManager.getConnection(url, user, pwd);// 得到连接对象
String sql = "update ETLNEEDPARAM set F_VALUE = ? where F_KEY = ? ";// 要执行的SQL语句
PreparedStatement stmt = conn.prepareStatement(sql);// 加载SQL语句
// PreparedStatement支持SQL带有问号?,可以动态替换?的内容。
Reader clobReader = new StringReader(text); // 将 text转成流形式
stmt.setString(2, key);
stmt.setCharacterStream(1, clobReader, text.length());// 替换sql语句中的?
int num = stmt.executeUpdate();// 执行SQL
if (num > 0) {
System.out.println("ok");
} else {
System.out.println("NO");
}
stmt.close();
conn.close();
return num;
}

private static String clobExport() throws ClassNotFoundException, SQLException, IOException {

CLOB clob = null;
String sql = "select F_VALUE from ETLNEEDPARAM where F_KEY ='test1'";
DriverManager.registerDriver(new OracleDriver());
Connection conn = DriverManager.getConnection(url, user, pwd);// 得到连接对象
PreparedStatement stmt = conn.prepareStatement(sql);
ResultSet rs = stmt.executeQuery();
String content = "";
if (rs.next()) {
clob = (oracle.sql.CLOB) rs.getClob("F_VALUE"); // 获得CLOB字段str
// 注释: 用 rs.getString("str")无法得到 数据 ,返回的 是 NULL;
content = ClobToString(clob);
}
stmt.close();
conn.close();
return content;
}

// 将字CLOB转成STRING类型

public static String ClobToString(CLOB clob) throws SQLException, IOException {
String reString = "";
Reader is = clob.getCharacterStream();// 得到流
BufferedReader br = new BufferedReader(is);
String s = br.readLine();
StringBuffer sb = new StringBuffer();
// 执行循环将字符串全部取出付值给StringBuffer由StringBuffer转成STRING
while (s != null) {
sb.append(s);
s = br.readLine();
}
reString = sb.toString();
return reString;
}

public static void main(String[] args) throws IOException,ClassNotFoundException, SQLException {
// System.out.println(clobImport());
System.out.println(clobUpdate("fmo"));
System.out.println(clobUpdate("epo"));

// System.out.println(clobExport());

}
### Oracle 中将 CLOB 数据类型转换为字符串的方法 在编程中,可以采用多种方式将 CLOB 类型的数据转换为字符串。以下是两种主要方法: #### 方法一:SQL 查询中的 `DBMS_LOB.SUBSTR` 函数 可以通过 SQL 查询直接使用 `DBMS_LOB.SUBSTR` 函数来提取 CLOB 字段的内容并将其作为字符串返回。此函数允许指定起始位置和最长度,从而避免一次性读取过数据量引发错误。 ```sql SELECT DBMS_LOB.SUBSTR(content, 4000, 1) AS string_content FROM table; ``` 需要注意的是,这种方法存在一定的局限性——如果 CLOB 的内容超出指定的最长度,则无法完全展示其内容,并可能抛出异常[^1]。 #### 方法二:Java 编程实现 CLOB 转换 另一种更为灵活的方式是在 Java 应用程序中完成 CLOBString 的转换操作。这种方式不受限于单次读取的小限制,适合处理超大容量的 CLOB 数据。 以下是一个完整的 Java 实现示例: ```java import java.sql.Clob; import java.sql.SQLException; import java.io.BufferedReader; import java.io.IOException; import java.io.Reader; public class ClobConverter { /** * 将 CLOB 对象转换为标准字符串形式。 * * @param clob 输入的 CLOB 对象 * @return 返回对应的字符串表示 */ public static String ClobToString(Clob clob) throws SQLException, IOException { StringBuilder result = new StringBuilder(); try (Reader reader = clob.getCharacterStream()) { BufferedReader bufferedReader = new BufferedReader(reader); char[] buffer = new char[8192]; int length; while ((length = bufferedReader.read(buffer)) != -1) { result.append(new String(buffer, 0, length)); } } return result.toString(); } } ``` 上述代码片段展示了如何利用缓冲区逐步读取 CLOB 流并将之拼接成最终的字符串结果。相比单纯依赖数据库内置功能,这种方案更加健壮且适用于各种复杂场景[^2]。 最后一步是从 ResultSet 或其他数据源获取目标列值,并强制转型为目标类型的实例化对象再传递至辅助类进行解析: ```java String content = ClobConverter.ClobToString((Clob)obj[1]); ``` 以上两步共同构成了整个流程的核心逻辑部分[^1]。 ### 注意事项 无论采取哪种策略都需要充分考虑实际业务需求以及性能开销等因素的影响;特别是针对海量级存储单元的操作更应谨慎评估资源消耗情况以免造成不必要的负担或者失败风险。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值