CLOB是内置类型,将字符大对象存储为数据库表某一行中的一个列值。默认情况下,驱动程序使用SQL locator实现Clob对象,这意味着CLOB对象包含一个指向SQL CLOB数据的逻辑指针而不是数据本身。
在JAVA如何使用CLOB进行 *** 作?
在绝大多数情况下,有2种方法使用CLOB。
1、相对比较小的,可以用String进行直接 *** 作,把CLOB看成字符串类型即可。
2、如果比较大,可以用 getAsciiStream 或者 getUnicodeStream 以及对应的 setAsciiStream 和 setUnicodeStream 即可。
(1)读取数据:
ResultSet rs = stmtexecuteQuery("SELECT TOP 1 FROM Test1"); rsnext(); Reader reader = rsgetCharacterStream(2);
(2)插入数据:
PreparedStatement pstmt = conprepareStatement("INSERT INTO test1 (c1_id, c2_vcmax) VALUES (, )"); pstmtsetInt(1, 1); pstmtsetString(2, htmlStr); pstmtexecuteUpdate();
(3)更新数据:
Statement stmt = concreateStatement(); ResultSet rs = stmtexecuteQuery("SELECT FROM test1"); rsnext(); Clob clob = rsgetClob(2); long pos = clobposition("dog", 1); clobsetString(1, "cat", len, 3); rsupdateClob(2, clob); rsupdateRow();
那么java是如何 *** 作数据库clob字段的?
示例代码如下: package comtestdbclob; import javaioBufferedReader; import javaioIOException; import javaioWriter; import javasqlClob; import javasqlConnection; import javasqlDriverManager; import javasqlPreparedStatement; import javasqlResultSet; import javasqlSQLException; import javasqlStatement; public class ClobTest {undefined private static Connection conn; static {undefined try {undefined ClassforName("oraclejdbcdriverOracleDriver"); conn = DriverManagergetConnection( "jdbc:oracle:thin:@localhost:1521:orcl","scott","tiger"); } catch (ClassNotFoundException e) {undefined eprintStackTrace(); } catch (SQLException e) {undefined eprintStackTrace(); } } public static void main(String[] args) throws SQLException, IOException {undefined testInsert(); testUpdate(); testRead(); } private static void testInsert() throws SQLException {undefined String sql = "insert into test_clob values(1, empty_clob())"; Statement stm = conncreateStatement(); stmexecute(sql); } private static void testUpdate() throws SQLException, IOException {undefined String sql = "select content from test_clob where id = 1 for update"; Statement stm = conncreateStatement(); ResultSet rs = stmexecuteQuery(sql); while (rsnext()) {undefined Clob c = rsgetClob(1); ctruncate(0);// clear Writer w = csetCharacterStream(1);//The first position is 1 wwrite("abc"); wclose(); csetString(clength() + 1, "abc"); conncommit(); } } private static void testRead() throws SQLException, IOException {undefined String sql = "select content from test_clob where id = 1"; PreparedStatement pstm = connprepareStatement(sql); ResultSet rs = pstmexecuteQuery(); while (rsnext()) {undefined Clob clob = rsgetClob("content"); Systemoutprintln("clobgetSubString(1, 2) --> " + clobgetSubString(1, 2)); Systemoutprintln("clobgetSubString(1, (int)cloblength()) --> " + clobgetSubString(1, (int)cloblength())); BufferedReader r = new BufferedReader(clobgetCharacterStream()); String s; while ((s = rreadLine()) != null) {undefined Systemoutprintln(s); } rclose(); } } }当通过insert语句直接插入大量字符串(主要是html的内容),超过4000字符时候,就会报:
ORA-01489: 字符串连接的结果过长
虽然字段是clob,足以存储,但是通过这种直接插入的时候,因为没有强制指定带插入字符串为clob类型,
oracle会把插入的字符串作为 “字符串类型”处理,由于oracle有最大字符串限制(不超过4000个字符),所以会报错。
解决思路:指定待插入字符串类型为clob,可以使用过程或存储过程
例子:
DECLARE
REALLYBIGTEXTSTRING CLOB := '待插入的海量字符串';
BEGIN
INSERT INTO test_table VALUES('test', REALLYBIGTEXTSTRING, '0');
end ;
/
commit;
这样就可以解决问题。
补充:java的jdk对这种情景有通过l流的方式处理,因此比较方便。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)