OCI 中的 LOB - 需要 explanation/tutorial

LOB in OCI - need explanation/tutorial

作为 OCI 的新手,我很难理解 LOB 的工作原理。有人可以解释一下吗? 虽然我已经阅读了手册并查看了演示,但我仍然觉得很难。 是否有简单的示例代码可以在同一代码中读取和写入多个 LOB?

  • 有各种开源 OCI 包装器库。你可以查看他们的源代码。
  • 此外,Oracle 在数据库服务器安装中提供了各种示例源
  • 您还可以在 Metalink 上找到更多高级示例

Oracle 确实区分了 LOB(位于某个数据段中的数据)和 LOB 处理程序(Unix 中的某个文件文件句柄)。只能在数据库内部创建 lob 句柄。例如这条语句:

insert into t(id, lob_col) values(1, emtpty_blob()) returning lob_col into :bval;

这将向数据库中插入一行,将创建一个空的 BLOB 并将 return lob 处理程序发送给应用程序。绑定变量 "bval" 必须注册(绑定)为 OUT 参数。在这里,许多开发人员在想要 "insert" 某些数据时不理解 "why LOB is an out parameter"。重点是只能在数据库端创建lob handle。当您拥有它时,您可以像使用文件句柄一样使用它。

你只需要使用 OCIRead2/OCIWrire2/OCIOpen/OCIClose 个函数。

当您要更新 LOB 时,必须锁定其基础行:

select id, lob_col from t where id = 1 for update;

这将 return 一个可以打开进行写入的 LOB 句柄。只要事务处于打开状态,您就可以写入 LOB 句柄。当您提交事务时,任何对 lob 句柄的进一步写入都将失败。

您可以根据需要分配任意数量的 lob 句柄,并且可以按任何顺序使用。请记住,每个 lob 句柄都与一个数据库连接相关联,并且只要该连接处于活动状态就有效。

已编辑: 还有一条评论:不要使用 OCILobRead,而要使用 OCILobRead2。当OCILobRead 接受以字节为单位读取的偏移量,但 returns 是读取的字符数。 当您阅读 UTF8 编码的 CLOBS 时,如果您假设#bytes=#chars,您会感到一团糟。 OCILobRead2 returns 既读取了#chars 又读取了#bytes。

PS:警告。 LOB 以 1st byte/char 开头。您不能搜索到第 0 个位置。