Oracle817读取CLOB问题解决

最近搞的Hibernate集成oracle817,读取Clob字段时一直报错:

io 异常: 类型长度大于最大值;

 

百度、google大家都说是驱动问题,换了N个驱动一样的错误,官网oracle817的驱动是.zip的,搞得不知怎么用,总是加载不到驱动,直接解压到classes文件中,报错:

java.lang.AbstractMethodError

 

最后看到oracle的jdbc目录下有demo,终于找到了正解:

// 读取CLOB字段
	static String dumpClob(Connection conn, CLOB clob) throws Exception {
		String clobStr = "";
		CallableStatement cstmt1 = (CallableStatement) conn
				.prepareCall("begin ? := dbms_lob.getLength (?); end;");
		CallableStatement cstmt2 = (CallableStatement) conn
				.prepareCall("begin dbms_lob.read (?, ?, ?, ?); end;");

		cstmt1.registerOutParameter(1, Types.NUMERIC);
		cstmt1.setClob(2, clob);
		cstmt1.execute();

		long length = cstmt1.getLong(1);
		long i = 0;
		int chunk = 10;

		while (i < length) {
			cstmt2.setClob(1, clob);
			cstmt2.setLong(2, chunk);
			cstmt2.registerOutParameter(2, Types.NUMERIC);
			cstmt2.setLong(3, i + 1);
			cstmt2.registerOutParameter(4, Types.VARCHAR);
			cstmt2.execute();

			long read_this_time = cstmt2.getLong(2);
			String string_this_time = cstmt2.getString(4);

			clobStr += string_this_time;

			// System.out.print("Read " + read_this_time + " chars: ");
			// System.out.println(string_this_time);
			i += read_this_time;
		}

		cstmt1.close();
		cstmt2.close();

		return clobStr;
	}

 

//读取BOLB
	static void fillBlob(Connection conn, BLOB blob, long length)
			throws Exception {
		CallableStatement cstmt1 = (CallableStatement) conn
				.prepareCall("begin dbms_lob.write (?, ?, ?, ?); end;");

		long i = 0;
		long chunk = 10;

		byte[] data = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

		while (i < length) {
			cstmt1.setBlob(1, blob);
			cstmt1.setLong(2, chunk);
			cstmt1.setLong(3, i + 1);
			data[0] = (byte) i;
			cstmt1.setBytes(4, data);
			cstmt1.execute();

			i += chunk;
			if (length - i < chunk)
				chunk = length - i;
		}

		cstmt1.close();
	}

 

这种问题感觉应该比较常见,在网上竟没有解决方法,特此记录一下,供遇到同样问题的人员参考。

 

你可能感兴趣的:(oracle)