人大金仓数据库KingbaseES OCI中的大对象及其操作

金仓数据库KingbaseES———OCI中的大对象及其操作

关键字:

大对象、CLOB、BLOB、人大金仓、KingbaseES

OCI涉及的大对象类型

CLOB与BLOB是数据库中常用的两种大字段类型,适用于半结构化数据和非结构化数据,各种数据库都为其提供了专门的操作机制。BLOB和CLOB是可以互换的,或者可以用LOB字段来代替这两种大对象类型。

(1) CLOB

CLOB的全称为Character Large Object,即字符大对象,是数据库中保存文件所使用的数据类型。SQL CLOB是内置类型,将字符大对象存储为数据库表某一行中的一个列值。默认情况下,驱动程序使用SQL locator实现CLOB对象, CLOB对象包含一个指向SQL CLOB数据的逻辑指针而不是数据本身,这个指针在被创建的事务处理期间有效。在一些数据库里,也使用Text作为CLOB的别名,例如SQL SERVER。文本文件、PDF文档、较长的文字、XML文件等大型文本数据通常采用CLOB存储,能对后续的查询更新操作提供便利。CLOB还有一个衍生的对象,即NCLOB(National Character Large Object),表示大小可变的CLOB对象,使用NCHAR保存数据,指向SQL CLOB数据的逻辑指针。

(2) BLOB

BLOB的全称为Binary Large Object,即二进制大对象,是一个可以存储二进制文件的字段类型。BLOB通常指一个大文件,例如图片、音频、视频、GIF文件等,由于其组织方式特殊,需要先将其转换为二进制再进行处理。

(3)BFILE

BFILE的全称为External Binary File,即外部二进制文件,存储在数据库表空间外的服务器操作系统文件中的大型数据对象,但可从数据库表访问,应用程序可通过只读方式访问,可用于存储任何类型的数据。

OCI中对大对象的操作

LOB实例可以是持久的(存储在数据库表空间中,BLOB,CLOB,NCLOB,具有Oracle数据库的完整事务支持),也可以是临时的(存储在应用程序的范围内,可以像局部变量一样使用)。OCI可以为持久性和临时性LOB提供支持,包含一组用于对数据库中的大对象(LOB)执行操作的函数。

(1)创建或修改

创建和修改持久性LOB有两种方式。第一种是数据接口,可以将字符数据直接插入CLOB列或者将RAW数据直接插入BLOB列来创建LOB,还可使用UPDATE语句修改LOB,将字符数据绑定到CLOB列或者将RAW数据绑定到BLOB列。第二种是使用LOB定位器。首先通过OCIDescriptorAlloc( )初始化新的LOB定位器,调用OCIAttrSet( )将其设置为空(使用OCI_ATTR_LOBEMPTY属性),然后将定位器绑定到INSERT语句中的占位符来创建新的内部LOB,将空的定位器插入到具有LOB列的表中,然后执行SELECT 进行FOR UPDATE操作以获取定位器,并使用OCI LOB函数写入。值得注意的是,在修改LOB列的时候,必须打开一个事务,锁定包含LOB的行。

(2)LOB读/写

为了提高LOB的读/写性能,OCI提出了多种措施:①为LOB使用了数据接口,只需要一次往返即可插入或者查询LOB;②调用OCILobGetChunkSize( )返回LOB可用块的大小,以便应用程序可以批量处理整个块的写操作,而不是为同一个块发出多个LOB写调用;③调用OCILobWriteAppend2( )将数据附加到LOB的末尾,不需要OCILobGetLength2( )与OCILobWrite2( )的结合使用;④通过使用OCILobArrayRead( )、OCILobArrayWrite( )一次性读写多个LOB定位器的数据,减少了读写操作的往返次数。

(3)LOB打开关闭

OCI提供了显式打开和关闭LOB以及测试LOB是否打开的功能,标记着一系列LOB操作的开始和结束,便于LOB操作执行结束后触发器和索引更新的处理。如果操作未包含在OCILobOpen( )与OCILobClose( )调用中间,每次对LOB的修改都会隐式打开和关闭LOB,从而触发与LOB修改相关联的任何触发器,对应的索引也会在修改时更新。其中,有两种情况需要重建功能和域索引:①在提交事务之前关闭与该事务相关的处于打开状态的LOB会返回错误,此时LOB已经关闭,事务也已经提交,但并没有更新域和功能索引;②一个打开且没有事务的LOB必须在当前会话结束之前关闭,否则LOB不再标记为打开状态,且与其关联的域和功能索引也不会被更新。

为避免以上问题,LOB制定了开闭机制:①在提交事务之前,应用程序必须关闭所有先前打开的LOB,如果回滚事务,会丢弃所有打开的LOB以及所做的更改,也不会触发关联的触发器;②打开的内部LOB数量没有限制,但是SESSION_MAX_OPEN_FILES参数确定的打开文件数量有限制,且将已经打开的定位器分配给另外一个定位器不断打开新的LOB;③关闭尚未打开的LOB是错误的;④在同一事务中使用不同的定位器或者相同的定位器两次打开或关闭相同的LOB是错误的。以下事务必须关闭打开的LOB:①SET TRANSACTION和COMMIT;②DATA MODIFYING或SELECT…FOR UPDATE和COMMIT;③在自治事务块内。

(4)LOB读写回调

OCI支持读写回调,在查询和插入操作中代替了流式LOB的轮询方法。应用程序可以自定义读写函数,并通过OCILobRead2( )、OCILobWriteAppend2( )和OCILobWrite2( )调用向OCI注册。回调函数的一般原型为:

CallbackFunction(dvoid *ctxp, CONST dvoid *bufp,

ub4 len, ub1 piece, void **changed_bufpp, ub8 *changed_lenp);

其中,ctxp是读写函数调用时传递给OCI的回调的上下文,bufp是指向存储区域的指针,piece参数用于指示返回的信息是第一个(OCI_FIRST_PIECE)、下一个(OCI_NEXT_PIECE)还是最后一个(OCI_LAST_PIECE)。可以根据changed_bufpp和changed_lenp参数动态更改缓冲区的地址和长度。如果应用程序未更改缓冲区,这两个参数无需使用。读写回调函数执行成功返回OCI_CONTINUE,继续执行下一段数据的读写,返回其他则读写中止。

(5)临时LOB支持

OCI提供一系列接口用于创建和释放临时LOB,OCILobCreateTemporary( )、OCILobFreeTemporary( )、OCILobIsTemporary( )。此外,在持久LOB上运行的OCI函数也可用于临时LOB。

参考资料

KES客户端编程接口及框架简介

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值