作为OCI的新手,我发现很难理解LOB是如何工作的。有人可以解释一下吗? 虽然我已经阅读了手册并查看了演示,但我仍然觉得很难。 是否有简单的示例代码只能在同一代码中读取和写入多个LOB?
答案 0 :(得分:1)
Oracle确实区分了LOB(位于某个数据段中的数据)和LOB处理程序(Unix中的文件文件句柄)。只能在数据库内创建一个lob句柄。例如这句话:
insert into t(id, lob_col) values(1, emtpty_blob()) returning lob_col into :bval;
这将在数据库中插入一行,将创建一个空的BLOB并将lob处理程序返回给应用程序。绑定变量" bval"必须注册(绑定)为OUT参数。在这里,许多开发人员不理解"为什么LOB是一个out参数"当他们想要"插入"一些数据。关键点是只能在数据库端创建lob句柄。当你拥有它时,你可以使用它,因为它是一个文件句柄。
您只需使用OCIRead2 / OCIWrire2 / OCIOpen / OCIClose功能。
如果要更新LOB,必须锁定其基础行:
select id, lob_col from t where id = 1 for update;
这将返回一个可以打开以进行写入的LOB句柄。只要事务处于打开状态,您就可以写入LOB句柄。提交事务时,任何对lob句柄的进一步写入都将失败。
您可以根据需要分配任意数量的高手柄,您可以按任意顺序使用。请记住,每个lob句柄都与一个DB连接相关联,只要此连接处于活动状态,该句柄就有效。
编辑: 还有一条评论:不要使用OCILobRead,而是使用OCILobRead2。当OCILobRead 接受要以字节为单位读取的偏移量,但返回读取的字符数。 当您阅读UTF8编码的CLOBS时,如果假设#bytes = #chars,则会弄得一团糟。 OCILobRead2返回#chars read和#bytes read。
PS:警告。 LOB以第一个字节/ char开头。你不能找到第0位。