非洲小白脸 阅读(364) 评论(0)  编辑  收藏 所属分类: oracle

Oracle中的BLOB和CLOB

一、区别和定义

LONG: 可变长的字符串数据,最长2G,LONG具有VARCHAR2列的特性,可以存储长文本一个表中最多一个LONG列

LONG RAW: 可变长二进制数据,最长2G

CLOB: 字符大对象Clob 用来存储单字节的字符数据

NCLOB: 用来存储多字节的字符数据

BLOB: 用于存储二进制数据

BFILE: 存储在文件中的二进制数据,这个文件中的数据只能被只读访。但该文件不包含在数据库内。

bfile字段实际的文件存储在文件系统中,字段中存储的是文件定位指针.bfile对oracle来说是只读的,也不参与事务性控制和数据恢复.

CLOB,NCLOB,BLOB都是内部的LOB(Large Object)类型,最长4G,没有LONG只能有一列的限制

要保存图片、文本文件、Word文件各自最好用哪种数据类型?

--BLOB最好,LONG RAW也不错,但Long是oracle将要废弃的类型,因此建议用BLOB。

二、操作

1、 get

CLOB

java 代码

//获得数据库连接

Connection con = ConnectionFactory.getConnection();

con.setAutoCommit(false);

Statement st = con.createStatement();

//不需要“for update”

ResultSet rs = st.executeQuery("select CLOBATTR from TESTCLOB where ID=1");

if (rs.next())

{

java.sql.Clob clob = rs.getClob("CLOBATTR");

Reader inStream = clob.getCharacterStream();

char[] c = new char[(int) clob.length()];

inStream.read(c);

//data是读出并需要返回的数据,类型是String

data = new String(c);

inStream.close();

}

inStream.close();

con.commit();

con.close();

BLOB

java 代码

//获得数据库连接

Connection con = ConnectionFactory.getConnection();

con.setAutoCommit(false);

Statement st = con.createStatement();

//不需要“for update”

ResultSet rs = st.executeQuery("select BLOBATTR from TESTBLOB where ID=1");

if (rs.next())

{

java.sql.Blob blob = rs.getBlob("BLOBATTR");

InputStream inStream = blob.getBinaryStream();

//data是读出并需要返回的数据,类型是byte[]

data = new byte[input.available()];

inStream.read(data);

inStream.close();

}

inStream.close();

con.commit();

con.close();

2、 put

CLOB

java 代码

//获得数据库连接

Connection con = ConnectionFactory.getConnection();

con.setAutoCommit(false);

Statement st = con.createStatement();

//插入一个空对象empty_clob()

st.executeUpdate("insert into TESTCLOB (ID, NAME, CLOBATTR) values (1, "thename", empty_clob())");

//锁定数据行进行更新,注意“for update”语句

ResultSet rs = st.executeQuery("select CLOBATTR from TESTCLOB where ID=1 for update");

if (rs.next())

{

//得到java.sql.Clob对象后强制转换为oracle.sql.CLOB

oracle.sql.CLOB clob = (oracle.sql.CLOB) rs.getClob("CLOBATTR");

Writer outStream = clob.getCharacterOutputStream();

//data是传入的字符串,定义:String data

char[] c = data.toCharArray();

outStream.write(c, 0, c.length);

}

outStream.flush();

outStream.close();

con.commit();

con.close();

BLOB

java 代码

//获得数据库连接

Connection con = ConnectionFactory.getConnection();

con.setAutoCommit(false);

Statement st = con.createStatement();

//插入一个空对象empty_blob()

st.executeUpdate("insert into TESTBLOB (ID, NAME, BLOBATTR) values (1, "thename", empty_blob())");

//锁定数据行进行更新,注意“for update”语句

ResultSet rs = st.executeQuery("select BLOBATTR from TESTBLOB where ID=1 for update");

if (rs.next())

{

//得到java.sql.Blob对象后强制转换为oracle.sql.BLOB

oracle.sql.BLOB blob = (oracle.sql.BLOB) rs.getBlob("BLOBATTR");

OutputStream outStream = blob.getBinaryOutputStream();

//data是传入的byte数组,定义:byte[] data

outStream.write(data, 0, data.length);

}

outStream.flush();

outStream.close();

con.commit();

con.close();

=======================================================================

厚厚发表于 2006年06月27日

网络上很多关于JAVA对Oracle中BLOB、CLOB类型字段的操作说明,有的不够全面,有的不够准确,甚至有的简直就是胡说八道。最近的项目正巧用到了这方面的知识,在这里做个总结。

环境:

Database: Oracle 9i

App Server: BEA Weblogic 8.14

表结构:

CREATE TABLE TESTBLOB (ID Int, NAME Varchar2(20), BLOBATTR Blob)

CREATE TABLE TESTBLOB (ID Int, NAME Varchar2(20), CLOBATTR Clob)

JAVA可以通过JDBC,也可以通过JNDI访问并操作数据库,这两种方式的具体操作存在着一些差异,由于通过App Server的数据库连接池JNDI获得的数据库连接提供的java.sql.Blob和java.sql.Clob实现类与JDBC方式提供的不同,因此在入库操作的时候需要分别对待;出库操作没有这种差异,因此不用单独对待。

一、BLOB操作

1、入库

(1)JDBC方式

//通过JDBC获得数据库连接

Class.forName("oracle.jdbc.driver.OracleDriver");

Connection con = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:testdb", "test", "test");

con.setAutoCommit(false);

Statement st = con.createStatement();

//插入一个空对象empty_blob()

st.executeUpdate("insert into TESTBLOB (ID, NAME, BLOBATTR) values (1, "thename", empty_blob())");

//锁定数据行进行更新,注意“for update”语句

ResultSet rs = st.executeQuery("select BLOBATTR from TESTBLOB where ID=1 for update");

if (rs.next())

{

//得到java.sql.Blob对象后强制转换为oracle.sql.BLOB

oracle.sql.BLOB blob = (oracle.sql.BLOB) rs.getBlob("BLOBATTR");

OutputStream outStream = blob.getBinaryOutputStream();

//data是传入的byte数组,定义:byte[] data

outStream.write(data, 0, data.length);

}

outStream.flush();

outStream.close();

con.commit();

con.close();

(2)JNDI方式

//通过JNDI获得数据库连接

Context context = new InitialContext();

ds = (DataSource) context.lookup("ORA_JNDI");

Connection con = ds.getConnection();

con.setAutoCommit(false);

Statement st = con.createStatement();

//插入一个空对象empty_blob()

st.executeUpdate("insert into TESTBLOB (ID, NAME, BLOBATTR) values (1, "thename", empty_blob())");

//锁定数据行进行更新,注意“for update”语句

ResultSet rs = st.executeQuery("select BLOBATTR from TESTBLOB where ID=1 for update");

if (rs.next())

{

//得到java.sql.Blob对象后强制转换为weblogic.jdbc.vendor.oracle.OracleThinBlob(不同的App Server对应的可能会不同)

weblogic.jdbc.vendor.oracle.OracleThinBlob blob = (weblogic.jdbc.vendor.oracle.OracleThinBlob) rs.getBlob("BLOBATTR");

OutputStream outStream = blob.getBinaryOutputStream();

//data是传入的byte数组,定义:byte[] data

outStream.write(data, 0, data.length);

}

outStream.flush();

outStream.close();

con.commit();

con.close();

2、出库

//获得数据库连接

Connection con = ConnectionFactory.getConnection();

con.setAutoCommit(false);

Statement st = con.createStatement();

//不需要“for update”

ResultSet rs = st.executeQuery("select BLOBATTR from TESTBLOB where ID=1");

if (rs.next())

{

java.sql.Blob blob = rs.getBlob("BLOBATTR");

InputStream inStream = blob.getBinaryStream();

//data是读出并需要返回的数据,类型是byte[]

data = new byte[input.available()];

inStream.read(data);

inStream.close();

}

inStream.close();

con.commit();

con.close();

二、CLOB操作

1、入库

(1)JDBC方式

//通过JDBC获得数据库连接

Class.forName("oracle.jdbc.driver.OracleDriver");

Connection con = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:testdb", "test", "test");

con.setAutoCommit(false);

Statement st = con.createStatement();

//插入一个空对象empty_clob()

st.executeUpdate("insert into TESTCLOB (ID, NAME, CLOBATTR) values (1, "thename", empty_clob())");

//锁定数据行进行更新,注意“for update”语句

ResultSet rs = st.executeQuery("select CLOBATTR from TESTCLOB where ID=1 for update");

if (rs.next())

{

//得到java.sql.Clob对象后强制转换为oracle.sql.CLOB

oracle.sql.CLOB clob = (oracle.sql.CLOB) rs.getClob("CLOBATTR");

Writer outStream = clob.getCharacterOutputStream();

//data是传入的字符串,定义:String data

char[] c = data.toCharArray();

outStream.write(c, 0, c.length);

}

outStream.flush();

outStream.close();

con.commit();

con.close();

(2)JNDI方式

//通过JNDI获得数据库连接

Context context = new InitialContext();

ds = (DataSource) context.lookup("ORA_JNDI");

Connection con = ds.getConnection();

con.setAutoCommit(false);

Statement st = con.createStatement();

//插入一个空对象empty_clob()

st.executeUpdate("insert into TESTCLOB (ID, NAME, CLOBATTR) values (1, "thename", empty_clob())");

//锁定数据行进行更新,注意“for update”语句

ResultSet rs = st.executeQuery("select CLOBATTR from TESTCLOB where ID=1 for update");

if (rs.next())

{

//得到java.sql.Clob对象后强制转换为weblogic.jdbc.vendor.oracle.OracleThinClob(不同的App Server对应的可能会不同)

weblogic.jdbc.vendor.oracle.OracleThinClob clob = (weblogic.jdbc.vendor.oracle.OracleThinClob) rs.getClob("CLOBATTR");

Writer outStream = clob.getCharacterOutputStream();

//data是传入的字符串,定义:String data

char[] c = data.toCharArray();

outStream.write(c, 0, c.length);

}

outStream.flush();

outStream.close();

con.commit();

con.close();

2、出库

//获得数据库连接

Connection con = ConnectionFactory.getConnection();

con.setAutoCommit(false);

Statement st = con.createStatement();

//不需要“for update”

ResultSet rs = st.executeQuery("select CLOBATTR from TESTCLOB where ID=1");

if (rs.next())

{

java.sql.Clob clob = rs.getClob("CLOBATTR");

Reader inStream = clob.getCharacterStream();

char[] c = new char[(int) clob.length()];

inStream.read(c);

//data是读出并需要返回的数据,类型是String

data = new String(c);

inStream.close();

}

inStream.close();

con.commit();

con.close();

需要注意的地方:

1、java.sql.Blob、oracle.sql.BLOB、weblogic.jdbc.vendor.oracle.OracleThinBlob几种类型的区别

2、java.sql.Clob、oracle.sql.CLOB、weblogic.jdbc.vendor.oracle.OracleThinClob几种类型的区别

oracle中clob和blob,Oracle中的BLOB和CLOB相关推荐

  1. 文件上传存至oracle,fileupload上传文件存储到oracle Blob字段中

    从网上查了许多资料,攒了个功能,暂且记下来,呵呵.需要apache的fileupload组件和io组件. // 建立一个新的Upload对象 DiskFileUpload upload = new D ...

  2. oracle clob 查询换行,oracle中Clob字段中的回车换行在jsp中展示的问题

    在开发过程出现这么一个问题: 比如:一个字段content 类型CLOB,这其中存的有可能复制粘贴过来的word excel html中的内容,用java将这些内容存入,存入后有特殊的符号 比如回车换 ...

  3. oracle数据库中用sql拼接字符串和转成clob存储在数据库中

    1.转成字符串,存储到数据库中 -- B.DESCRIPT73,为需要转换的字段 --||'<br />'则代表在需要转换的字段后面拼接上一个换行符,存到数据库中 select F.POL ...

  4. oracle集群数据库事务配置,在 .NET中使用Oracle数据库事务-安装配置-Oracle频道-中国IT实验室...

    在本文中,您将了解到如何在 Visual Basic .NET (VB.NET) 和 Visual .NET () 中使用数据库事务.具体来讲,您将系统学习数据库事务.在 .NET 程序中使用 Tra ...

  5. oracle数据按条件清表,ociuldr v2.1 支持CLOB,BLOB数据类型

    1.dcba的ociuldr工具 ociuldr这个工具初始是由dcba开发的,用的是v7版的oci函数库 目的是完成导出Oracle中的数据到文本文件这样的功能 这个工具流传的非常广 详细介绍可以参 ...

  6. 怎样给oracle表设置序列,Oracle的sequence序列在hibernate中的配置方法

    Oracle自增序列在Hibernate中的配置方法 在很多情况下,我们使用Hibernate在已经建立好数据库的基础上.在oracle中,如果已经建立好的数据库中使用了sequence,则可以按照下 ...

  7. oracle中key,mysql中的key在oracle中是什么

    mysql中的key在oracle中是什么 说明一下.key在oracle中对应的是什么? 比如说: CREATE TABLE `AdBanner` ( `BannerId` int(8) NOT N ...

  8. oracle 查询字段除了as,Oracle中怎样查询数据表的哪个字段是主键

    工作中要用到 Oracle 10g,经常要向其中的某张表插入事件发生的日期及时间.专门就 Oracle 的日期及时间显示方式和插入方式记一笔 工作中要用到 Oracle 10g,经常要向其中的某张表插 ...

  9. 从oracle9i/92数据库中导出数据至 oracle 8.1.7 数据库中

    根据ORACLE官方文档的说明,一旦数据库创建后,数据库的字符集是不能改变的.因此,提前考虑自己的数据库将选用哪一种字符集 是十分重要的.数据库字符集选择的一般规则是将数据库字符集设定为操作系统本地字 ...

  10. oracle中asm磁盘不足,Oracle用户无法访问ASM磁盘组问题

    1. 权限问题引起找不到ASM磁盘组 1.1 确认操作系统用户属主 # 确认属主 Grid Infrastructure Home Owner : grid Primary Group : oinst ...

最新文章

  1. 3D Cube计算引擎加速运算
  2. wkwebView基本使用方法
  3. Apache Artemis —— 非堵塞 Java 嵌入消息服务
  4. UnicodeEncodeError: 'ascii' codec can't encode character '\xe3' in position 0: ordinal not in range
  5. 使用java调用fastDFS客户端进行静态资源文件上传
  6. 跟我一起学.NetCore之配置变更监听
  7. 自定义字体 (暂不支持中文)
  8. 计算机协会换届答辩ppt,国奖答辩PPT-精选版.ppt
  9. 音乐格式转换软件测试工程师,免费音频转换器:如何把MP3文件转换为其他格式...
  10. html带有进度条的登陆,带进度条上传
  11. 使用matlab产生LED灯闪烁代码在普中板子中实验
  12. Unity Shader Alpha测试
  13. 并列关系表合集PPT模板
  14. 独家分享《让×××飞》普清640 x 276 迅雷下载 姜文新作
  15. 怎么把excel表格转换成word格式
  16. mmc子系统分析(一)
  17. 右击我的电脑--管理--计算机管理,在我的电脑上点右键-管理打不开了?
  18. 湿气重会有哪些表现?如何祛湿
  19. 常用的连续概率分布汇总
  20. 压缩包密码忘记了打不开?教你用pyhton轻松解决,附视频讲解

热门文章

  1. linux内核简介和进程管理
  2. JS iframe 跨域
  3. AutoCAD VBA创建椭圆和样条曲线
  4. Jquery中$与$.fn的区别
  5. 8.这就是搜索引擎:核心技术详解 --- 网页反作弊
  6. 7.UNIX 环境高级编程--进程环境
  7. vue路由传多个参数_vue路由传参(两种方法总结)
  8. js中普通函数与函数对象
  9. 自己编写的中文字符串的截取函数
  10. maven编译时出现读取XXX时出错invalid LOC header bad signature