站内搜索: 请输入搜索关键词

当前页面: 开发资料首页JSP 专题oracle?怎样同时插入两个大于4000个字节的大字段类型

oracle?怎样同时插入两个大于4000个字节的大字段类型

摘要: oracle?怎样同时插入两个大于4000个字节的大字段类型


现在,我遇到这样的问题。在oracle数据库中,用java程序往数据库中同时插两个大于4000个字节的大字段类型会报错。不能同时插。只能先插一个大字段的数据,再把另个大字段的数据update进去。这样才可以。我觉得这样有两次数据库的操作,不很理想。oracle应该有解决方案的。但我不是很清楚。请高手教教我。在线等待。。。。。。
也可以msn联系:hui.huang@msn.com


晕 LZ应该去ORACLE数据库 那边问呀 呵呵


http://pmzs.spaces.live.com/blog/cns!7E8825EBAAF9703D!115.entry


这个应该有java程序员遇到过。不关oracle那边的事。


不会吧. 用blob 字段不行么?

我用过的可以啊

用blob,或者clob的时候, 插入或者update都要用到 stream流


我是用struts+spring+hibernate结构


单用blob和clob可以,但是同时往oracle数据库插两个大于4000个字节的大字段类型(blob和clob)就不行了,如果只有一个大字段小于4000个字节也是可以的。


这样啊...

我还没不知道

学习学习了. 自己没有测试过

错误是什么错误呢?


如何用JSP处理Oracle中CLOB类型的字段
1. CLOB字段的插入
clob类型的数据直接insert可能会因为字符过长而出错,所以要用对象形式插入.
示例:
首先,创建一个含CLOB字段的表:create table test (id INTEGER, content clob);
然后插入空值
String strSql = “INSERT INTO TEST(id,content) values(‘0001’,?) ”;
con.setAutoCommit(false); //conn为Connection对象
//创建并实例化一个CLOB对象
CLOB clob = new CLOB((OracleConnection)con);
clob = oracle.sql.CLOB.createTemporary((OracleConnection)con,true,1);
//对CLOB对象赋值
clob.putString(1,formateSingleQuotes(Content));
OracleConnection OCon = (OracleConnection)con;
OraclePreparedStatement pstmt = (OraclePreparedStatement)OCon.prepareCall(strSql);
//设置CLOB变量
pstmt.setCLOB(1,clob);
int i = pstmt.executeUpdate();
pstmt.close();
OCon.commit();
OCon = null;
con = null;
Boolean flag = true;
if(i <=0) { flag = false; }
if (flag == true) { out.print( "<script>alert('成功保存!'); </script>");}
else { out.print( "<script>alert('保存数据时出错,请检查你输入的数据格式是否符合要求');self.history.back ();</script>");}

注意:
一定不要忘记引入包:import oracle.sql.*,oracle.jdbc.driver.*
2. CLOB类型的修改
对CLOB字段的修改除了sql语句外其他和插入相同
String strSql = “UPDATE TEST set content=? Where Id=’0001’ ”;
con.setAutoCommit(false); //conn为Connection对象
//创建并实例化一个CLOB对象
CLOB clob = new CLOB((OracleConnection)con);
clob = oracle.sql.CLOB.createTemporary((OracleConnection)con,true,1);
//对CLOB对象赋值
clob.putString(1,formateSingleQuotes(Content));
OracleConnection OCon = (OracleConnection)con;
OraclePreparedStatement pstmt = (OraclePreparedStatement)OCon.prepareCall(strSql);
pstmt.setCLOB(1,clob);
int i = pstmt.executeUpdate();
pstmt.close();
OCon.commit();
OCon = null;
con = null;
Boolean flag = true;
if(i <=0){ flag = false;}
if (flag == true){out.print( "<script>alert('成功保存!'); </script>");}
else {out.print( "<script>alert('保存数据时出错,请检查你输入的数据格式是否符合要求');self.history.back ();</script>"); }

最简单的方法:换用Oracle 10g的驱动(到www.oracle.com去下载),剩下的事情就简单了,直接用pstmt.setString()赋值,直接用rs.getString()读值就OK了,没有所谓4k的限制,我今天整了一天才发现原来可以这么简单的。我的数据库是Oracle 9i


theforever(碧海情天)老兄:
同时往oracle数据库插两个大于4000个字节的大字段类型,这样行不行啊?


没错
在往大字段 BLOB CLOB插入数据时候都要进行初始化
比如是BLOB 插入数据
首先需要插入一条空记录, BLOB字段对应empty_blob()
然后去更新这个字段。
觉得这个东西比较复杂,但一直没有找到合适的方法 本来一次操作就OK拉 居然要2次才能达到目的

象前面那位大哥的代码描述仍然有很多问题
对大字段进行处理 那段代码并不是通用的
必须考虑 你的JDK 还有你的JDBC版本 还有服务器与数据库的驱动
考虑挺多的 我也是在一次项目中领教到他的厉害

下面代码执行环境
JDK 4.5+TOMCAT5.5+ORACLE 10G
和JDK 4.5+WEBLOGIC9.1+ORACLE 10G
服务器与数据库的驱动是ORACLE的(不是WEBLOGIC本身的)
/**
* 更新文件文件内容
*
* @param dao
* ReportDAO Object
* @param dto
* ReportDTO Object
* @param file
* FormFile Object
* @exception Exception
* if an exception occurs
* @return count 1表示更新成功否则0
*/
private int updateBlobObject(FormFile file, UploadDAO dao, UploadDTO dto)
throws Exception {

// 定义输出流,输入流
OutputStream outStream = null;
InputStream inStream = null;
// 获取数据库连接
DatabaseConnection connection = DatabaseConnectionManager.getMyConnection();
String querySql = "SELECT FILECONTENT FROM UPLOADFILEINFO WHERE CID = ? FOR UPDATE";
PreparedStatement ps2 = connection.prepareStatement(querySql);
// 设置需要获得文件对应的CID
ps2.setString(1, dto.getCid());
ResultSet rs = ps2.executeQuery();
try {
// 更新文件内容
if (rs.next()) {
// 获取被更新文件内容的BLOB对象
Blob updateFileContent = (Blob) rs.getBlob(1);
// 获取输出流
outStream = updateFileContent.setBinaryStream(0);
// 获取输入流
inStream = file.getInputStream();
// 将文件流写入对象
byte[] b = new byte[file.getFileSize()];
int len = 0;
while ((len = inStream.read(b)) != -1) {
outStream.write(b, 0, len);
}
}
} catch (Exception e) {
return 0;
} finally {
// 关闭输入流 输出流
try {
if (inStream != null) {
inStream.close();
inStream = null;
}
} catch (Exception e) {
return 0;
}
try {
if (outStream != null) {
outStream.close();
outStream = null;
}
} catch (Exception e) {
return 0;
}
}

return 1;
}



谢谢各位仁兄的帮忙,如果是对一个大字段的操作,不管是blob,clob,long,本人都以解决。可对两个大字段的同时的insert和update就不行了,只能一个一个的操作了。这样很麻烦的,效率也不好。难道就只能是后面的解决方案?oracle不至于这么蠢吧!


oracle的确有此问题,我原来也碰到过.不过解决方案在暂时找不到了(记得用了一个oracle的函数),明天到单位后给你答复(单位的电脑里有)


keiy() 兄:
在线等待............................................................................................................


Hibernate:

PO中用String类型
xx.hbm.xml中用text类型
数据库中用clob类型

包你成功

hibernate3.1以上版本,2.X的没试过



mark


blob或者clob都可以


SQL写成这样就可以了(test表,两个blob字段)
insert into test values(empty_blob(),empty_blob()) returning a1,a2 into :a1,:a2



两次插入在一个事物里可以吗?


to:tomandy(第6元素)
是的。


keiy() ,可以对那个语句解释一下吗?谢谢!



to:keiy()
empty_blob(),empty_blob()这两个是什么,是什么意思了?能否详细点。谢谢!


to:keiy():
明白了,我试试。


empty_blob() 初始化 blob对象


同感


to:keiy():
强!


使用oracle10 最新的JDBC驱动试试。oracle9的有bug


如果是用hibernate同时插入了大字段呢?


楼主测试成功没有阿


好像不行:
看看对不对,
Connection conn = session.connection();
PreparedStatement ps=conn.prepareStatement("insert into wy_b_survey values(empty_clob(),empty_clob()) returning questiondata,background into :questiondata,:background");
ps.setString(0,survey.getQuestiondata());
ps.setString(1,survey.getBackground());
ps.executeUpdate();
ps.close();
conn.close();


empty_clob()这个函数是给大字段赋初值,returning 就不太明了,是返回值?


to keiy()兄 :
能不能给整个代码看看


我原来是在delphi中发现此问题的,且在delphi中解决的.
insert into test values(empty_blob(),empty_blob()) returning a1,a2 into :a1,:a2
其中后面的:a1,:a2为两个参数.JAVA中应该写成
insert into test values(empty_blob(),empty_blob()) returning a1,a2 into ?,?
另外,如果还不行可以用存储过程,oracle的存储过程可以做到直接将图像文件插入数据库,可参考:
http://oracle.chinaitlab.com/PLSQL/383329.html



谢谢!



应该是SQL语句超大了


↑返回目录
前一篇: 如何不让客户端保存密码?
后一篇: Microsoft SQL Server 2000 SP4 为何三个文件? 我应该安装哪一个??