用sql语句查询clob字段的问题,请大家帮忙! 本来就是clob,我是要转化为string(VARCHAR2),请问如何转,要在sql中转换 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 在sql中直接读成String不行吧 clob 是用流读取的 byte[] b;clob.put(b);String str=new String(b); 曾经好象做过这样的,有点模糊了,不过大概意思是这样的byte[] b;clob.put(b);String str=new String(b); 在Oracle中,LOB(Large Object,大型对象)类型的字段现在用得越来越多了。因为这种类型的字段,容量大(最多能容纳4GB的数据),且一个表中可以有多个这种类型的字段,很灵活,适用于数据量非常大的业务领域(如图象、档案等)。而LONG、LONG RAW等类型的字段,虽然存储容量也不小(可达2GB),但由于一个表中只能有一个这样类型的字段的限制,现在已很少使用了。 LOB类型分为BLOB和CLOB两种:BLOB即二进制大型对象(Binary Large Object),适用于存贮非文本的字节流数据(如程序、图象、影音等)。而CLOB,即字符型大型对象(Character Large Object),则与字符集相关,适于存贮文本型的数据(如历史档案、大部头著作等)。下面以程序实例说明通过JDBC操纵Oracle数据库LOB类型字段的几种情况。先建立如下两个测试用的数据库表,Power Designer PD模型如下: 建表SQL语句为:CREATE TABLE TEST_CLOB ( ID NUMBER(3), CLOBCOL CLOB)CREATE TABLE TEST_BLOB ( ID NUMBER(3), BLOBCOL BLOB)一、 CLOB对象的存取1、往数据库中插入一个新的CLOB对象public static void clobInsert(String infile) throws Exception{/* 设定不自动提交 */boolean defaultCommit = conn.getAutoCommit();conn.setAutoCommit(false);try {/* 插入一个空的CLOB对象 */stmt.executeUpdate("INSERT INTO TEST_CLOB VALUES ('111', EMPTY_CLOB())");/* 查询此CLOB对象并锁定 */ResultSet rs = stmt.executeQuery("SELECT CLOBCOL FROM TEST_CLOB WHERE ID='111' FOR UPDATE");while (rs.next()) {/* 取出此CLOB对象 */oracle.sql.CLOB clob = (oracle.sql.CLOB)rs.getClob("CLOBCOL");/* 向CLOB对象中写入数据 */BufferedWriter out = new BufferedWriter(clob.getCharacterOutputStream());BufferedReader in = new BufferedReader(new FileReader(infile));int c;while ((c=in.read())!=-1) {out.write(c);}in.close();out.close();}/* 正式提交 */conn.commit();} catch (Exception ex) {/* 出错回滚 */conn.rollback();throw ex;}/* 恢复原提交状态 */conn.setAutoCommit(defaultCommit);}2、修改CLOB对象(是在原CLOB对象基础上进行覆盖式的修改)public static void clobModify(String infile) throws Exception{/* 设定不自动提交 */boolean defaultCommit = conn.getAutoCommit();conn.setAutoCommit(false);try {/* 查询CLOB对象并锁定 */ResultSet rs = stmt.executeQuery("SELECT CLOBCOL FROM TEST_CLOB WHERE ID='111' FOR UPDATE");while (rs.next()) {/* 获取此CLOB对象 */oracle.sql.CLOB clob = (oracle.sql.CLOB)rs.getClob("CLOBCOL");/* 进行覆盖式修改 */BufferedWriter out = new BufferedWriter(clob.getCharacterOutputStream());BufferedReader in = new BufferedReader(new FileReader(infile));int c;while ((c=in.read())!=-1) {out.write(c);}in.close();out.close();}/* 正式提交 */conn.commit();} catch (Exception ex) {/* 出错回滚 */conn.rollback();throw ex;}/* 恢复原提交状态 */conn.setAutoCommit(defaultCommit);} 3、替换CLOB对象(将原CLOB对象清除,换成一个全新的CLOB对象)public static void clobReplace(String infile) throws Exception{/* 设定不自动提交 */boolean defaultCommit = conn.getAutoCommit();conn.setAutoCommit(false);try {/* 清空原CLOB对象 */stmt.executeUpdate("UPDATE TEST_CLOB SET CLOBCOL=EMPTY_CLOB() WHERE ID='111'");/* 查询CLOB对象并锁定 */ResultSet rs = stmt.executeQuery("SELECT CLOBCOL FROM TEST_CLOB WHERE ID='111' FOR UPDATE");while (rs.next()) {/* 获取此CLOB对象 */oracle.sql.CLOB clob = (oracle.sql.CLOB)rs.getClob("CLOBCOL");/* 更新数据 */BufferedWriter out = new BufferedWriter(clob.getCharacterOutputStream());BufferedReader in = new BufferedReader(new FileReader(infile));int c;while ((c=in.read())!=-1) {out.write(c);}in.close();out.close();}/* 正式提交 */conn.commit();} catch (Exception ex) {/* 出错回滚 */conn.rollback();throw ex;}/* 恢复原提交状态 */conn.setAutoCommit(defaultCommit);}4、CLOB对象读取public static void clobRead(String outfile) throws Exception{/* 设定不自动提交 */boolean defaultCommit = conn.getAutoCommit();conn.setAutoCommit(false);try {/* 查询CLOB对象 */ResultSet rs = stmt.executeQuery("SELECT * FROM TEST_CLOB WHERE ID='111'");while (rs.next()) {/* 获取CLOB对象 */oracle.sql.CLOB clob = (oracle.sql.CLOB)rs.getClob("CLOBCOL");/* 以字符形式输出 */String content = new String();if (clob != null) { Reader is = clob.getCharacterStream(); BufferedReader br = new BufferedReader(is); String s = br.readLine(); while (s != null) { content += s; s = br.readLine(); } }}} catch (Exception ex) {conn.rollback();throw ex;}/* 恢复原提交状态 */conn.setAutoCommit(defaultCommit);} 得到Clob之后调用如下代码就可以了.Clob content_Clob=getYourClog();long contentLength;String content=null;if(content_Clob!=null){ contentLength=content_Clob.length(); content=content_Clob.getSubString(1,(int)contentLength); } to kingofhawks(蓝鹰) 我按你的这样做法,抛出了异常:java.sql.SQLException: 类型长度大于最大值........java.sql.SQLException: 违反协议.......另外,我的环境:Oracle8i,ojdbc14.jar不知道这是为什么?先谢谢了 把你出异常的那部分代码贴出来看看,首先确保你的数据库表设计正确的哦:>另外我不知道8i的数据库是否支持Clob,以上代码是在Oracle 10g中通过. 8i也是支持的,只是可能一些细节不一样,我想LZ还是按照 softken2005() 和 kingofhawks(蓝鹰) 这样子做,应该是没有问题的。 to kingofhawks(蓝鹰) :我的问题已经解决,换了驱动(oracle.jar)就行了。谢谢 fanter(爱了就爱了) 我的问题已经解决,换了驱动(oracle.jar)就行了。谢谢------------------------------------------------------你这个什么驱动啊? 网站打不开怎么办? 谁用过ChinaPay,做过在线支付的? jsp获取参数的问题 java电子相册源码分享--请高手们指教 项目开发周期问题 EJB3.0的stateless session bean 的困惑? java调用存储过程结果集问题 (关系到jdk sql 的实现问题,如果分数不够可以再开帖加分) 急求blog例子,在线等。 關於EJB的問題,各位高手請指教!先謝了 使用confirm()按确定退出登录返回登录页面,按取消留在当前未退出登录页面 WebService服务中如何得到客户端 传递过来的参数信息(100分) 自动监测问题
clob.put(b);
String str=new String(b);
byte[] b;
clob.put(b);
String str=new String(b);
LOB类型分为BLOB和CLOB两种:BLOB即二进制大型对象(Binary Large Object),适用于存贮非文本的字节流数据(如程序、图象、影音等)。而CLOB,即字符型大型对象(Character Large Object),则与字符集相关,适于存贮文本型的数据(如历史档案、大部头著作等)。
下面以程序实例说明通过JDBC操纵Oracle数据库LOB类型字段的几种情况。
先建立如下两个测试用的数据库表,Power Designer PD模型如下:
建表SQL语句为:
CREATE TABLE TEST_CLOB ( ID NUMBER(3), CLOBCOL CLOB)
CREATE TABLE TEST_BLOB ( ID NUMBER(3), BLOBCOL BLOB)
一、 CLOB对象的存取
1、往数据库中插入一个新的CLOB对象
public static void clobInsert(String infile) throws Exception
{
/* 设定不自动提交 */
boolean defaultCommit = conn.getAutoCommit();
conn.setAutoCommit(false);
try {
/* 插入一个空的CLOB对象 */
stmt.executeUpdate("INSERT INTO TEST_CLOB VALUES ('111', EMPTY_CLOB())");
/* 查询此CLOB对象并锁定 */
ResultSet rs = stmt.executeQuery("SELECT CLOBCOL FROM TEST_CLOB WHERE ID='111' FOR UPDATE");
while (rs.next()) {
/* 取出此CLOB对象 */
oracle.sql.CLOB clob = (oracle.sql.CLOB)rs.getClob("CLOBCOL");
/* 向CLOB对象中写入数据 */
BufferedWriter out = new BufferedWriter(clob.getCharacterOutputStream());
BufferedReader in = new BufferedReader(new FileReader(infile));
int c;
while ((c=in.read())!=-1) {
out.write(c);
}
in.close();
out.close();
}
/* 正式提交 */
conn.commit();
} catch (Exception ex) {
/* 出错回滚 */
conn.rollback();
throw ex;
}
/* 恢复原提交状态 */
conn.setAutoCommit(defaultCommit);
}
2、修改CLOB对象(是在原CLOB对象基础上进行覆盖式的修改)
public static void clobModify(String infile) throws Exception
{
/* 设定不自动提交 */
boolean defaultCommit = conn.getAutoCommit();
conn.setAutoCommit(false);
try {
/* 查询CLOB对象并锁定 */
ResultSet rs = stmt.executeQuery("SELECT CLOBCOL FROM TEST_CLOB WHERE ID='111' FOR UPDATE");
while (rs.next()) {
/* 获取此CLOB对象 */
oracle.sql.CLOB clob = (oracle.sql.CLOB)rs.getClob("CLOBCOL");
/* 进行覆盖式修改 */
BufferedWriter out = new BufferedWriter(clob.getCharacterOutputStream());
BufferedReader in = new BufferedReader(new FileReader(infile));
int c;
while ((c=in.read())!=-1) {
out.write(c);
}
in.close();
out.close();
}
/* 正式提交 */
conn.commit();
} catch (Exception ex) {
/* 出错回滚 */
conn.rollback();
throw ex;
}
/* 恢复原提交状态 */
conn.setAutoCommit(defaultCommit);
}
3、替换CLOB对象(将原CLOB对象清除,换成一个全新的CLOB对象)
public static void clobReplace(String infile) throws Exception
{
/* 设定不自动提交 */
boolean defaultCommit = conn.getAutoCommit();
conn.setAutoCommit(false);
try {
/* 清空原CLOB对象 */
stmt.executeUpdate("UPDATE TEST_CLOB SET CLOBCOL=EMPTY_CLOB() WHERE ID='111'");
/* 查询CLOB对象并锁定 */
ResultSet rs = stmt.executeQuery("SELECT CLOBCOL FROM TEST_CLOB WHERE ID='111' FOR UPDATE");
while (rs.next()) {
/* 获取此CLOB对象 */
oracle.sql.CLOB clob = (oracle.sql.CLOB)rs.getClob("CLOBCOL");
/* 更新数据 */
BufferedWriter out = new BufferedWriter(clob.getCharacterOutputStream());
BufferedReader in = new BufferedReader(new FileReader(infile));
int c;
while ((c=in.read())!=-1) {
out.write(c);
}
in.close();
out.close();
}
/* 正式提交 */
conn.commit();
} catch (Exception ex) {
/* 出错回滚 */
conn.rollback();
throw ex;
}
/* 恢复原提交状态 */
conn.setAutoCommit(defaultCommit);
}
4、CLOB对象读取
public static void clobRead(String outfile) throws Exception
{
/* 设定不自动提交 */
boolean defaultCommit = conn.getAutoCommit();
conn.setAutoCommit(false);
try {
/* 查询CLOB对象 */
ResultSet rs = stmt.executeQuery("SELECT * FROM TEST_CLOB WHERE ID='111'");
while (rs.next()) {
/* 获取CLOB对象 */
oracle.sql.CLOB clob = (oracle.sql.CLOB)rs.getClob("CLOBCOL");
/* 以字符形式输出 */
String content = new String();
if (clob != null) {
Reader is = clob.getCharacterStream();
BufferedReader br = new BufferedReader(is);
String s = br.readLine();
while (s != null) {
content += s;
s = br.readLine();
}
}}
} catch (Exception ex) {
conn.rollback();
throw ex;
}
/* 恢复原提交状态 */
conn.setAutoCommit(defaultCommit);
}
Clob content_Clob=getYourClog();
long contentLength;
String content=null;
if(content_Clob!=null){
contentLength=content_Clob.length();
content=content_Clob.getSubString(1,(int)contentLength);
}
java.sql.SQLException: 类型长度大于最大值
.....
...
java.sql.SQLException: 违反协议
....
...另外,我的环境:
Oracle8i,ojdbc14.jar不知道这是为什么?先谢谢了
谢谢
谢谢
------------------------------------------------------
你这个什么驱动啊?