📜  介绍 LOB 定位器

📅  最后修改于: 2021-09-08 16:18:32             🧑  作者: Mango

大对象 (LOB)定位器让您可以在Transact-SQL 语句中引用LOB ,而不是引用 LOB 本身,因为文本的大小可以是 unitext,或者图像 LOB 可以是许多兆字节。在 Transact-SQL 语句中使用LOB 定位器有助于减少客户端和 SAP ASE 之间的网络流量,还可以减少客户端处理 LOB 所需的内存量SAP ASE 或 Sybase ASE帮助客户端应用程序发送和接收定位符作为主机变量和参数标记。

LOB 定位器将在创建它的事务期间保持有效。每当事务提交或回滚时,SAP ASE 都会执行验证使定位器无效。

LOB 定位器中使用的数据类型:
LOB 定位器使用三种不同的数据类型:

  • text_locator :用于文本 LOB。
  • unitext_locator :用于 unitext LOB。
  • image_locator :用于图像 LOB。

为 LOB 定位器声明局部变量可以为定位器数据类型声明局部变量。
例如:

declare @v1 text_locator

因为 LOB 和定位器仅存储在内存中,所以不能将定位器数据类型用作用户表或视图的列数据类型,也不能用于约束或默认值中。

创建 LOB 定位器:可以显式或隐式地创建 LOB 定位器。

通常,在 Transact-SQL 语句中使用 LOB 定位器时,定位器会隐式转换为它们引用的 LOB。也就是说,只要将 LOB 定位器传递给 Transact-SQL函数,该函数就会对定位器引用的 LOB 进行操作。

您对定位器引用的 LOB 所做的任何更改都不会反映在数据库中的源 LOB 中 — 除非您明确保存它们。同样,如果您对数据库中存储的 LOB 所做的任何更改都不会反映在定位器引用的 LOB 中。

LOB 实例同时具有定位器。 LOB 定位器指的是 LOB 值的物理存储位置。 LOB 值被称为存储在 LOB 中的数据。

每当您在诸如将 LOB 作为参数传递之类的操作中使用 LOB 时,您实际上是在传递 LOB 定位符。在大多数情况下,您可以在应用程序中使用 LOB 实例,而无需关心 LOB 定位器的语义。不需要取消引用 LOB 定位器,因为在某些编程语言中需要使用指针。

关于 LOB 定位器的语义以及 LOB 值的存储方式,您仍然需要注意一些问题。

临时 LOB

您还可以创建类似于局部变量的临时 LOB,以帮助使用数据库 LOB。临时 LOB 不与任何表相关联,它们只能由它们的创建者访问,具有定位器(这是它们的访问方式),并且在会话结束时被删除。

不支持临时 BFILES。临时 LOB 只允许作为 INSERT、UPDATE 或 DELETE 语句的 WHERE 子句中的输入变量(IN 值)。它们也可以作为 INSERT 语句插入的值,或 UPDATE 语句的 SET 子句中的值。临时 LOB 没有来自数据库服务器的事务支持,这意味着您不能对它们执行 COMMITS 或 ROLLBACK。

临时 LOB 定位器可以跨越事务。当服务器异常终止以及从数据库 SQL 操作返回错误时,它们也会被删除。

应用程序中的 LOB 定位器
要在 Pro*C/C++ 应用程序中使用 LOB 定位器,我们必须包含 oci.h 头文件,并且必须为 BLOB 声明一个指向类型 OCIBlobLocator、CLOB 和 NCLOB 的 OCIClobLocator 或 BFILE 的 OCIBFileLocator 类型的指针。

对于 NCLOB,您可以

  • 在 Pro*C/C++ 声明中使用子句“CHARACTER SET IS NCHAR_CS”,
  • 或者,您必须已经在命令行或配置文件中使用了 NLS_CHAR 预编译器选项来设置 NLS_NCHAR 环境变量。