远程Sybase数据库技术支持,联系手机:13811580958,QQ:289965371!

 

随着Sybase被完全整合到SAP下,Sybase原来的支持网站被SAP Support Portal取代。
只有购买了SAP服务的用户才能使用账号登录SAP Support Portal进行介质下载、补丁升级、报Incident等。
目前,原Sybase所有产品(包括:Adaptive Server Enterprise、Sybase IQ、Replication Server、PowerDesigner等)的官方手册仍然可以从http://infocenter.sybase.com/help/index.jsp进行浏览或下载。暂不清楚该网站http://infocenter.sybase.com/help/index.jsp何时会被完全迁移到SAP Support上!
Sybase官方手册英文版有html和pdf两种格式,而中文版手册只有pdf一种格式。为了国内Sybase用户更方便、快捷地搜索Sybase常见产品的官方手册内容,特将中文版Sybase官方手册转为html格式!
Sybase产品官方手册中文版的html格式所有内容的版权归SAP公司所有!本博客站长是Sybase数据库的铁杆粉丝!

如有Sybase数据库技术问题需要咨询,请联系我!

  QQ :289965371 点击这里给我发消息
  Email:

以下官方手册为ASE 15.7 ESD#2中文版:

  1. 新增功能公告 适用于 Windows、Linux 和 UNIX 的 Open Server 15.7 和 SDK 15.7
  2. 新增功能摘要
  3. 新增功能指南
  4. ASE 15.7 发行公告
  5. 配置指南(windows)
  6. 安装指南(windows)
  7. 参考手册:构件块
  8. 参考手册:命令
  9. 参考手册:过程
  10. 参考手册:表
  11. Transact-SQL® 用户指南
  12. 系统管理指南,卷 1
  13. 系统管理指南,卷 2
  14. 性能和调优系列:基础知识
  15. 性能和调优系列:锁定和并发控制
  16. 性能和调优系列:监控表
  17. 性能和调优系列:物理数据库调优
  18. 性能和调优系列:查询处理和抽象计划
  19. 性能和调优系列:使用 sp_sysmon 监控 Adaptive Server
  20. 性能和调优系列:利用统计分析改进性能
  21. 程序员参考 jConnect for JDBC 7.0.7
  22. Adaptive Server Enterprise 中的 Java
  23. 组件集成服务用户指南
  24. Ribo 用户指南
  25. 内存数据库用户指南
  26. Sybase Control Center for Adaptive Server® Enterprise
  27. 安全性管理指南
  28. 实用程序指南

 


< 上一个 | 内容 | 下一步 >

大对象定位符支持


jConnect for JDBC 7.07 Adaptive Server Enterpris ODBC 驱动程序 15.7 支持大对象 (LOB) 定位符。 LOB 定位符中包含指向 LOB 数据的逻辑指 针,而不是数据本身,减少了通过网络在 Adaptive Server 和其客户端之 间传送的数据量。Adaptive Server 15.7 中引入了对 LOB 定位符的服务器 支持。

当连接到支持 LOB 定位符的 Adaptive Server 并关闭 autocommit 时, jConnect for JDBC 7.07 使用服务器端定位符访问 LOB 数据。否则, jConnect 会在客户端物化 LOB 数据。可以将整个 LOB API 用于客户端 物化 LOB 数据,但由于数据较大, API 性能可能会与用于 LOB 定位符 时不同。

Adaptive Server Enterprise ODBC 驱动程序 15.7 客户端无法使用 LOB 定 位符,除非连接到支持它的 Adaptive Server


image

注释 当您使用 LOB 定位符时,检索每个行上都包括 LOB 数据的大结果 集可能会影响应用程序的性能。Adaptive Server LOB 定位符作为结果 集的一部分返回,并获取 LOB 数据, jConnect ODBC 驱动程序必须 高速缓存剩余的结果集。 Sybase 建议您让结果集小一些,或者启用游标 支持来限制要高速缓存的数据的大小。

image


jConnect for JDBC 支持

要启用 LOB 定位符支持,请在 ENABLE_LOB_LOCATORS 连接属性设 置为 true 的情况下建立与 Adaptive Server 的连接。启用后,客户端应用 程序便可以使用 java.sql 软件包中的 BlobClob NClob 类访问定位符。


image

注释 如果 LOB 定位符和 autocommit 都已启用, jConnect 会自动将 LOB 定位符切换为客户端物化 LOB 定位符,即使连接的 Adaptive Server 能 够支持它们时也是如此。这会增大客户端使用的内存,而且可能会降低 性能。因此,建议您在设置了 autocommit off 时使用 LOB 定位符。

image


有关 BlobClob NClob 类的详细信息,请参见 Java 文档。


Adaptive Server Enterprise ODBC 驱动程序支持

若要启用 LOB 定位符支持,请在 EnableLOBLocator 连接属性设置为 1

的情况下建立与 Adaptive Server 的连接。当 EnableLOBLocator 设置为 0

(缺省值)时, ODBC 驱动程序无法检索 LOB 列的定位符。当启用

LOB 定位符时,连接应设置为 autocommit off

还必须在程序中包括 sybasesqltypes.h 文件。 sybasesqltypes.h 文件位于

ODBC 安装目录下的 include 目录中。


用于定位符支持的 ODBC 数据类型映射

用于 Adaptive Server 定位符数据类型的 ODBC 数据类型映射为:


ASE 数据类型

ODBC SQL 类型

ODBC C 类型

text_locator

SQL_TEXT_LOCATOR

SQL_C_TEXT_LOCATOR

image_locator

SQL_IMAGE_LOCATOR

SQL_C_ IMAGE_LOCATOR

unitext_locator

SQL_UNITEXT_LOCATOR

SQL_C_ UNITEXT_LOCATOR


支持的转换


Adaptive Server 定位符数据类型支持的转换为:


SQL_C_TEXT_ LOCATOR

SQL_C_IMAGE_ LOCATOR

SQL_C_UNITEXT_ LOCATOR

SQL_TEXT_LOCATOR

X

SQL_IMAGE_LOCATOR

X

SQL_UNITEXT_LOCATOR

X

SQL_LONGVARCHAR

SQL_WLONGVARCHAR

SQL_LONGVARBINARY

图例:x = 支持的转换。


支持 LOB 定位符的 ODBC API 方法

SQLBindCol TargetType 可以是任意 ODBC C 定位符数据类型。

SQLBindParameter ValueType 可以是任意 ODBC C 定位符数据类 型。 ParameterType 可以是任意 ODBC SQL 定位符数据类型。

SQLGetData TargetType 可以是任意 ODBC C 定位符数据类型。

SQLColAttribute SQL_DESC_TYPE SQL_DESC_CONCISE_TYPE

描述符可以返回任意 ODBC SQL 定位符数据类型。

SQLDescribeCol – 数据类型指针可以是任意 ODBC SQL 定位符数据 类型。

请参见 Microsoft ODBC API Reference(《Microsoft ODBC API 参考》)。


预取 LOB 数据的隐式转换


//Set Autocommit off SQLRETURN sr;


Adaptive Server Enterprise ODBC 驱动程序 15.7 中,当 Adaptive Server 返回 LOB 定位符时,您可以使用 SQLGetData SQLBindCol,通过将列 绑定到 SQL_C_CHAR SQL_C_WCHAR (对于 text 定位符)或 SQL_C_BINARY (对于 image 定位符)来检索基础预取 LOB 数据。

设置 SQL_ATTR_LOBLOCATOR 属性可在连接中启用或禁用定位符。 如果在连接字符串中指定了 EnableLOBLocator,则会使用 EnableLOBLocator 的值初始化 SQL_ATTR_LOBLOCATOR,否则,它 设置为 SQL_LOBLOCATOR_OFF (缺省值)。若要启用定位符,请将 该属性设置为 SQL_LOBLOCATOR_ON。使用 SQLSetConnectAttr 可设 置该属性的值,使用 SQLGetConnectAttr 可检索其值。

使用 SQLSetStatementAttr 可设置 SQL_ATTR_LOBLOCATOR_FETCHSIZE 以指定要检索的 LOB 数据的 大小 (对于二进制数据以字节为单位,对于字符数据以字符为单位)。 缺省值 0 表示不请求预取数据,值为 -1 将检索整个 LOB 数据。


image

image

注释 如果要检索的列的基础 LOB 数据大小超过您设置的预取数据大小, 则在 ODBC 客户端尝试直接检索数据时会引发本机错误 3202。发生这 种情况时,客户端可以通过调用 SQLGetData 获取基础定位符并执行定 位符的所有可用操作,来检索完整数据。


示例 1 当预取数据代表完整 LOB 值时,使用 SQLGetData 检索 image 定 位符:

sr = SQLSetConnectAttr(dbc, SQL_ATTR_AUTOCOMMIT, (SQLPOINTER)SQL_AUTOCOMMIT_OFF, 0);


//Enable LOB Locator for this exchange

sr = SQLSetConnectAttr(dbc, SQL_ATTR_LOBLOCATOR, (SQLPOINTER)SQL_LOCATOR_ON, 0);


//Set size of prefetched LOB data

sr = SQLSetStatementAttr(stmt, SQL_ATTR_LOBLOCATOR_FETCHSIZE, (SQLPOINTER)32768, 0);


//Get a locator from the server SQLLEN lLOBLen = 0;

Byte cBin[COL_SIZE];

SQLLEN lBin = sizeof(CBin);

unsigned char cLOC[SQL_LOCATOR_SIZE]; SQLLEN lLOC = sizeof(cLOC);


int id = 4;

SQLLEN l1 = sizeof(int); SQLLEN idLen = sizeof(int);

sr = SQLBindParameter(stmt, 1, SQL_PARAM_INPUT, SQL_C_LONG, SQL_INTEGER, idLen, 0, &id, idLen, &idLen);


printError(sr, SQL_HANDLE_STMT, stmt);


//Execute the select statement to return a locator sr = SQLExecDirect(stmt, selectCOL_SQL, SQL_NTS); printError(sr, SQL_HANDLE_STMT, stmt);


sr = SQLFetch(stmt);

printError(sr, SQL_HANDLE_STMT, stmt);


//Retrieve the binary data (Complete Data is returned) sr = SQLGetData(stmt, 1, SQL_C_BINARY, cBin, lBin, &lBin); printError(sr, SQL_HANDLE_STMT, stmt);


//Cleanup

sr = SQLFreeStmt(stmt, SQL_UNBIND);

sr = SQLFreeStmt(stmt, SQL_RESET_PARAMS); sr = SQLFreeStmt(stmt, SQL_CLOSE);


SQLEndTran(SQL_HANDLE_DBC, dbc,SQL_COMMIT);


//Disable LOB Locator for the future

sr = SQLSetConnectAttr(dbc, SQL_ATTR_LOBLOCATOR, (SQLPOINTER)SQL_LOCATOR_OFF, 0);


//Set Autocommit off SQLRETURN sr;

示例 2 当预取数据代表截断 LOB 值时,使用 SQLGetData 检索 image 定 位符:

sr = SQLSetConnectAttr(dbc, SQL_ATTR_AUTOCOMMIT, (SQLPOINTER)SQL_AUTOCOMMIT_OFF, 0);


//Enable LOB Locator for this exchange

sr = SQLSetConnectAttr(dbc, SQL_ATTR_LOBLOCATOR, (SQLPOINTER)SQL_LOCATOR_ON, 0);


//Set size of prefetched LOB data sr = SQLSetStatementAttr(stmt,

SQL_ATTR_LOBLOCATOR_FETCHSIZE, (SQLPOINTER)32768, 0);


//Get a locator from the server SQLLEN lLOBLen = 0;

Byte cBin[COL_SIZE];

SQLLEN lBin = sizeof(CBin);

unsigned char cLOC[SQL_LOCATOR_SIZE]; SQLLEN lLOC = sizeof(cLOC);


int id = 4;

SQLLEN l1 = sizeof(int); SQLLEN idLen = sizeof(int);

sr = SQLBindParameter(stmt, 1, SQL_PARAM_INPUT, SQL_C_LONG, SQL_INTEGER, idLen, 0, &id, idLen, &idLen);

printError(sr, SQL_HANDLE_STMT, stmt);


//Execute the select statement to return a locator sr = SQLExecDirect(stmt, selectCOL_SQL, SQL_NTS); printError(sr, SQL_HANDLE_STMT, stmt);

sr = SQLFetch(stmt);

printError(sr, SQL_HANDLE_STMT, stmt);


// Retrieve the binary data(Truncated data is returned)

sr = SQLGetData(stmt, 1, SQL_C_BINARY, cBin, lBin, &lBin);


if(sr == SQL_SUCCESS_WITH_INFO)

{

SQLTCHAR errormsg[ERR_MSG_LEN]; SQLTCHAR sqlstate[SQL_SQLSTATE_SIZE+1];

SQLINTEGER nativeerror = 0; SQLSMALLINT errormsglen = 0;


retcode = SQLGetDiagRec(handleType, handle, 1, sqlstate, &nativeerror, errormsg, ERR_MSG_LEN, &errormsglen);


printf("SqlState:%s Error Message:%s\n", sqlstate, errormsg);


//Handle truncation of LOB data; if data was truncated call SQLGetData to

// retrieve the locator.


/* Warning returns truncated LOB data */

if (NativeError == 32028) //Error code may change

{

BYTE ImageLocator[SQL_LOCATOR_SIZE];

sr = SQLGetData(stmt, 1, SQL_C_IMAGE_LOCATOR, &ImageLocator, sizeof(ImageLocator), &Len);

printError(sr, SQL_HANDLE_STMT, stmt);


/*

Perform locator specific calls using image Locator on a separate statement handle if needed

*/

}

}


//Cleanup

sr = SQLFreeStmt(stmt, SQL_UNBIND);

sr = SQLFreeStmt(stmt, SQL_RESET_PARAMS); sr = SQLFreeStmt(stmt, SQL_CLOSE);


SQLEndTran(SQL_HANDLE_DBC, dbc,SQL_COMMIT);


//Disable LOB Locator for the future

sr = SQLSetConnectAttr(dbc, SQL_ATTR_LOBLOCATOR, (SQLPOINTER)SQL_LOCATOR_OFF, 0);


使用定位符访问和处理 LOB

ODBC API 不直接支持 LOB 定位符。 ODBC 客户端应用程序必须使用 Transact-SQL 函数,才能对定位符进行运算和处理 LOB 值。 Adaptive Server Enterprise ODBC 驱动程序引入了若干存储过程来达成必需 Transact-SQL 函数的使用。

本节讨论如何对 LOB 定位符执行多种运算。这些参数的输入和输出值 可以是 Adaptive Server 可隐式转换为存储过程定义的任意类型。

有关此处所列的 Transact-SQL 命令和函数的详细信息,请参见 Adaptive Server Enterprise 《参考手册:构件块》中的 “Transact-SQL 函数”。


初始化 text 定位符


使用 sp_drv_create_text_locator 可创建 text_locator 并 (可选)初始化以为 其赋值。 sp_drv_create_text_locator 访问 Transact-SQL 函数 create_locator

语法 sp_drv_create_text_locator [init_value]

输入参数 init_value – 一个 varchar text 值,用于初始化新定位符。

输出参数 无。

结果集 一个类型为 text_locator 的列。定位符引用的 LOB 附带了 init_value


初始化 unitext 定位符


使用 sp_drv_create_unitext_locator 可创建 unitext_locator 并 (可选)初始 化以为其赋值。 sp_drv_create_unitext_locator 访问 Transact-SQL 函数 create_locator

语法 sp_drv_create_unitext_locator [init_value]

输入参数 init_value – 一个 univarchar unitext 值,用于初始化新定位符。

输出参数 无。

结果集 一个类型为 unitext_locator 的列。定位符引用的 LOB 附带了 init_value


初始化 image 定位符


使用 sp_drv_create_image_locator 可创建 image_locator 并 (可选)初始化 以为其赋值。 sp_drv_create_image_locator 访问 Transact-SQL 函数 create_locator

语法 sp_drv_create_image_locator [init_value]

输入参数 init_value – 一个 varbinary image 值,用于初始化新定位符。

输出参数 无。

结果集 一个类型为 image_locator 的列。定位符引用的 LOB 附带了 init_value


text 定位符中获取完整 text

使用 sp_drv_locator_to_text,它可访问 Transact-SQL 函数 return_lob

语法 sp_drv_locator_to_text locator

输入参数 locator – 要检索其值的 text_locator

输出参数 无。

结果集 一个含有 locator 所引用的 text 值的列。


unitext 定位符中获取完整 unitext

使用 sp_drv_locator_to_unitext,它可访问 Transact-SQL 函数 return_lob

语法 sp_drv_locator_to_unitext locator

输入参数 locator – 要检索其值的 unitext_locator

输出参数 无。

结果集 一个含有 locator 所引用的 unitext 值的列。


image 定位符中获取完整 image

使用 sp_drv_locator_to_image,它可访问 Transact-SQL 函数 return_lob

语法 sp_drv_locator_to_image locator

输入参数 locator – 要检索其值的 image_locator

输出参数 无。

结果集 一个含有 locator 所引用的 image 值的列。


text 定位符中获取子字符串

使用 sp_drv_text_substring,它可访问 Transact-SQL 函数 substring

语法 sp_drv_text_substring locator, start_position, length

输入参数 locator – 一个 text_locator 值,引用要处理的数据。

start_position – 一个 integer 值,指定要读取和检索的第一个字符的 位置。

length – 一个 integer 值,指定要读取的字符数。

输出参数 无。

结果集 一个类型为 text 的列,其中包含检索到的子字符串。


unitext 定位符中获取子字符串

使用 sp_drv_unitext_substring,它可访问 Transact-SQL 函数 substring

语法 sp_drv_unitext_substring locator, start_position, length

输入参数 locator – 一个 unitext_locator 值,引用要处理的数据。

start_position – 一个 integer 值,指定要读取和检索的第一个字符的 位置。

length – 一个 integer 值,指定要读取的字符数。

输出参数 无。

结果集 一个类型为 unitext 的列,其中包含检索到的子字符串。


image 定位符中获取子字符串

使用 sp_drv_image_substring,它可访问 Transact-SQL 函数 substring

语法 sp_drv_image_substring locator, start_position, length


输入参数 locator – 一个 image_locator 值,引用要处理的数据。

start_position – 一个 integer 值,指定要读取和检索的第一个字节的 位置。

length – 一个 integer 值,指定要读取的字节数。

输出参数 无。

结果集 一个类型为 image 的列,其中包含检索到的子字符串。


在指定的位置插入 text


使用 sp_drv_text_setdata,它可访问 Transact-SQL 函数 setadata

语法 sp_drv_text_setdata locator, offset, new_data, data_length

输入参数 locator – 一个 text_locator 值,引用要插入到的 text 列。

offset – 一个 integer 值,指定开始写入新内容的位置。

new_data – 要插入的 varchar text 数据。

输出参数 data_length – 一个 integer 值,包含写入的字符数。

结果集 无。


在指定的位置插入 unitext


使用 sp_drv_unitext_setdata,它可访问 Transact-SQL 函数 setadata

语法 sp_drv_unitext_setdata locator, offset, new_data, data_length

输入参数 locator – 一个 unitext_locator 值,引用要插入到的 unitext 列。

offset – 一个 integer 值,指定开始写入新内容的位置。

new_data – 要插入的 univarchar unitext 数据。

输出参数 data_length – 一个 integer 值,包含写入的字符数。

结果集 无。


在指定的位置插入 image


使用 sp_drv_image_setdata,它可访问 Transact-SQL 函数 setadata

语法 sp_drv_image_setdata locator, offset, new_data, datalength

输入参数 locator – 一个 image_locator 值,引用要插入到的 image 列。

offset – 一个 integer 值,指定开始写入新内容的位置。

new_data – 要插入的 varbinary image 数据。


输出参数 data_length – 一个 integer 值,包含写入的字节数。

结果集 无。


插入定位符引用的 text


使用 sp_drv_text_locator_setdata,它可访问 Transact-SQL 函数 setadata

语法 sp_drv_text_locator_setdata locator, offset, new_data_locator, data_length

输入参数 locator – 一个 text_locator 值,引用要插入到的 text 列。

offset – 一个 integer 值,指定开始写入新内容的位置。

new_data_locator – 一个 text_locator 值,引用要插入的 text 数据。

输出参数 data_length – 一个 integer 值,包含写入的字符数。

结果集 无。


插入定位符引用的 unitext


使用 sp_drv_unitext_locator_setdata,它可访问 Transact-SQL 函数

setadata

语法 sp_drv_unitext_locator_setdata locator, offset, new_data_locator, data_length

输入参数 locator – 一个 unitext_locator 值,引用要插入到的 unitext 列。

offset – 一个 integer 值,指定开始写入新内容的位置。

new_data_locator – 一个 unitext_locator 值,引用要插入的 unitext 数 据。

输出参数 data_length – 一个 integer 值,包含写入的字符数。

结果集 无。


插入定位符引用的 image


使用 sp_drv_image_locator_setdata,它可访问 Transact-SQL 函数

setadata

语法 sp_drv_image_locator_setdata locator, offset, new_data_locator, datalength

输入参数 locator – 一个 image_locator 值,引用要插入到的 image 列。

offset – 一个 integer 值,指定开始写入新内容的位置。

new_data_locator – 一个 image_locator 值,引用要插入的 image 数 据。


输出参数 data_length – 一个 integer 值,包含写入的字节数。

结果集 无。


截断基础 LOB 数据


使用 truncate lob 可截断 LOB 定位符引用的 LOB 数据。请参见 Adaptive Server Enterprise 《参考手册:命令》。


查找基础 text 数据的字符长度

使用 sp_drv_text_locator_charlength 可查找 text 定位符引用的 LOB 列的字 符长度。 sp_drv_text_locator_charlength 访问 Transact-SQL 函数 char_length

语法 sp_drv_text_locator_charlength locator, data_length

输入参数 locator – 一个 text_locator 值,引用要处理的 text 列。

输出参数 data_length – 一个 integer 值,指定 locator 引用的 text 列的字符长度。

结果集 无。


查找基础 text 数据的字节长度

使用 sp_drv_text_locator_bytelength 可查找 text 定位符引用的 LOB 列的字 节长度。 sp_drv_text_locator_bytelength 访问 Transact-SQL 函数 data_length

语法 sp_drv_image_locator_bytelength locator, data_length

输入参数 locator – 一个 text_locator 值,引用要处理的 text 列。

输出参数 data_length – 一个 integer 值,指定 locator 引用的 text 列的字节长度。

结果集 无。


查找基础 unitext 数据的字符长度

使用 sp_drv_unitext_locator_charlength 可查找 unitext 定位符引用的 LOB 列 的字符长度。 sp_drv_unitext_locator_charlength 访问 Transact-SQL 函数 char_length

语法 sp_drv_unitext_locator_charlength locator, data_length

输入参数 locator – 一个 unitext_locator 值,引用要处理的 unitext 列。

输出参数 data_length – 一个 integer 值,指定 locator 引用的 unitext 列的字符长度。

结果集 无。


查找基础 unitext 数据的字节长度

使用 sp_drv_unitext_locator_bytelength 可查找 unitext 定位符引用的 LOB 列 的字节长度。 sp_drv_unitext_locator_bytelength 访问 Transact-SQL 函数 data_length

语法 sp_drv_image_locator_bytelength locator, data_length

输入参数 locator – 一个 unitext_locator 值,引用要处理的 unitext 列。

输出参数 data_length – 一个 integer 值,指定 locator 引用的 unitext 列的字节长度。

结果集 无。


查找基础 image 数据的字节长度

使用 sp_drv_image_locator_bytelength 可查找 image 定位符引用的 LOB 列 的字节长度。 sp_drv_image_locator_bytelength 访问 Transact-SQL 函数 data_length

语法 sp_drv_image_locator_bytelength locator, data_length

输入参数 locator – 一个 image_locator 值,引用要处理的 image 列。

输出参数 data_length – 一个 integer 值,指定 locator 引用的 image 列的字节长度。

结果集 无。


查找搜索字符串在定位符引用的 text 列内的位置

使用 sp_drv_varchar_charindex,它可访问 Transact-SQL 函数 charindex

语法 sp_drv_varchar_charindex search_string, locator, start, position

输入参数 search_string – 要搜索的类型为 varchar 的文字。

locator – 一个 text_locator 值,引用要在其中进行搜索的 text 列。

start – 一个整数值,指定开始搜索的位置。第一个位置是 1

输出参数 position – 一个 integer 值,指定 search_string locator 引用的 LOB 列 中的开始位置。

结果集 无。


查找一个 text 定位符引用的字符串在另一个定位符引用的 text 列中的位置

使用 sp_drv_textlocator_charindex,它可访问 Transact-SQL 函数

charindex


语法 sp_drv_textlocator_charindex search_locator, locator, start, position

输入参数 search_locator – 一个 text_locator 值,指向要搜索的文字。

locator – 一个 text_locator 值,引用要在其中进行搜索的 text 列。

start – 一个整数值,指定开始搜索的位置。第一个位置是 1

输出参数 position – 一个 integer 值,指定文字在 locator 引用的 LOB 列中的开始 位置。

结果集 无。


查找搜索字符串在定位符引用的 unitext 列内的位置

使用 sp_drv_univarchar_charindex,它可访问 Transact-SQL 函数

charindex

语法 sp_drv_univarchar_charindex search_string, locator, start, position

输入参数 search_string – 要搜索的类型为 univarchar 的文字。

locator – 一个 unitext_locator 值,引用要在其中进行搜索的 unitext

列。

start – 一个整数值,指定开始搜索的位置。第一个位置是 1

输出参数 position – 一个 integer 值,指定 search_string locator 引用的 LOB 列 中的开始位置。

结果集 无。


查找一个 unitext 定位符引用的字符串在另一个定位符引用的 unitext 列中的位置

使用 sp_drv_unitext_locator_charindex,它可访问 Transact-SQL 函数

charindex

语法 sp_drv_charindex_unitextloc_in_locator search_locator, locator, start, position

输入参数 search_locator – 一个 unitext_locator 值,指向要搜索的文字。

locator – 一个 unitext_locator 值,引用要在其中进行搜索的 text 列。

start – 一个整数值,指定开始搜索的位置。第一个位置是 1

输出参数 position – 一个 integer 值,指定文字在 locator 引用的 LOB 列中的开始 位置。

结果集 无。


查找字节序列在 image 定位符引用的列内的位置

使用 sp_drv_varbinary_charindex,它可访问 Transact-SQL 函数 charindex

语法 sp_drv_varbinary_charindex byte_sequence, locator, start, position

输入参数 byte_sequence – 要搜索的类型为 varbinary 的字节序列。

locator – 一个 image_locator 值,引用要在其中进行搜索的 image 列。

start – 一个整数值,指定开始搜索的位置。第一个位置是 1

输出参数 position – 一个 integer 值,指定 search_string locator 引用的 LOB 列 中的开始位置。

结果集 无。


查找一个 image 定位符引用的字节序列在另一个定位符引用的 image 列中的位置

使用 sp_drv_image_locator_charindex,它可访问 Transact-SQL 函数

charindex

语法 sp_drv_image_locator_charindex sequence_locator, locator, start, start_position

输入参数 sequence_locator – 一个 image_locator 值,指向要搜索的字节序列。

locator – 一个 image_locator 值,引用要在其中进行搜索的 image 列。

start – 一个整数值,指定开始搜索的位置。第一个位置是 1

输出参数 start_position – 一个 integer 值,指定字节序列在 locator 引用的 LOB 列 中的开始位置。

结果集 无。


检查 text_locator 引用是否有效

使用 sp_drv_text_locator_valid,它访问 locator_valid

语法 sp_drv_text_locator_valid locator

输入参数 locator – 要验证的 text_locator

输出参数 一个 bit,代表以下值之一:

0 falselocator 无效。

1 truelocator 有效。

结果集 无。


检查 unitext_locator 引用是否有效

使用 sp_drv_unitext_locator_valid,它访问 locator_valid

语法 sp_drv_unitext_locator_valid locator

参数 locator – 要验证的 unitext_locator

输出参数 一个 bit,代表以下值之一:

0 falselocator 无效。

1 truelocator 有效。

结果集 无。


检查 image_locator 引用是否有效

使用 sp_drv_image_locator_valid,它访问 locator_valid

语法 sp_drv_image_locator_valid locator

参数 locator – 要验证的 image_locator

输出参数 一个 bit,代表以下值之一:

0 falselocator 无效。

1 truelocator 有效。

结果集 无。


释放 LOB 定位符


使用 deallocate locator。请参见 Adaptive Server Enterprise 《参考手册:命 令》。


示例

示例 1 分配句柄并建立连接:

// Assumes that DSN has been named "sampledsn" and

// UseLobLocator has been set to 1.


SQLHENV environmentHandle = SQL_NULL_HANDLE; SQLHDBC connectionHande = SQL_NULL_HANDLE; SQLHSTMT statementHandle = SQL_NULL_HANDLE; SQLRETURN ret;

SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &environmentHandle); SQLSetEnvAttr(environmentHandle, SQL_ATTR_ODBC_VERSION, SQL_ATTR_OV_ODBC3); SQLAllocHandle(SQL_HANDLE_DBC, environmentHandle, &connectionHandle);

Ret = SQLConnect(connectionHandle, "sampledsn", SQL_NTS, "sa", SQL_NTS, "Sybase",SQL_NTS);


示例 2 选择列并检索定位符:

// Selects and retrieves a locator for bk_desc, where

// bk_desc is a column of type text defined in a table

// named books. bk_desc contains the text "A book".


SQLPrepare(statementHandle, "SELECT bk_desc FROM books WHERE bk_id =1", SQL_NTS);


SQLExecute(statementHandle);

BYTE TextLocator[SQL_LOCATOR_SIZE]; SQLLEN Len = 0;

ret = SQLGetData(statementHandle, SQL_C_TEXT_LOCATOR, TextLocator, sizeof(TextLocator),&Len);


If(Len == sizeof(TextLocator))

{

Cout << Locator was created with expected size << Len;

}

示例 3 确定数据长度:

SQLLEN LocatorLen = sizeof(TextLocator); ret = SQLBindParameter(statementHandle, 1,

SQL_PARAM_INPUT, SQL_C_TEXT_LOCATOR, SQL_TEXT_LOCATOR, SQL_LOCATOR_SIZE, 0, TextLocator,

sizeof(TextLocator), &LocatorLen);


SQLLEN CharLenSize = 0; SQLINTEGER CharLen = 0;

ret = SQLBindParameter(statementHandle, 2, SQL_PARAM_OUTPUT, SQL_C_LONG,SQL_INTEGER,0 , 0,

&CharLen, sizeof(CharLen), &CharLenSize); SQLExecDirect(statementHandle,

"{CALL sp_drv_text_locator_charlength( ?,?)}" , SQL_NTS);


cout<< "Character Length of Data " << charLen;

示例 4 LOB 列中附加文本:

SQLINTEGER retVal = 0;

SQLLEN Col1Len = sizeof(retVal);

SQLCHAR appendText[10]=abcdefghi on C++;


SQLBindParameter(statementHandle, 14,

SQL_PARAM_OUTPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &retVal, 0, Col1Len);


SQLBindParameter(statementHandle, 21, SQL_PARAM_INPUT,


SQL_C_TEXT_LOCATOR, SQL_TEXT_LOCATOR,

SQL_LOCATOR_SIZE, 0, &TextLocator, sizeof(TextLocator), SQL_NULL_HANDLE);


SQLBindParameter(statementHandle, 32, SQL_PARAM_INPUT,

SQL_C_SLONG, SQL_INTEGER, 0, 0, &charLen, 0, SQL_NULL_HANDLE);


SQLBindParameter(statementHandle, 43, SQL_PARAM_INPUT,

SQL_C_CHAR, SQL_CHAR, 10, 0, append_text, sizeof(append_text), SQL_NULL_HANDLE);


SQLExecDirect(statementHandle,

"{? = CALL sp_drv_setdata_text (?, ?, ?,?)}" , SQL_NTS);


SQLFreeStmt(statementHandle, SQL_CLOSE);

示例 5 LOB 定位符中检索 LOB 数据。

SQLCHAR description[512]; SQLLEN descriptionLength = 512;


SQLBindParameter(statementHandle, 1, SQL_PARAM_INPUT, SQL_C_TEXT_LOCATOR, SQL_TEXT_LOCATOR,

SQL_LOCATOR_SIZE, 0, TextLocator, sizeof(TextLocator), SQL_NULL_HANDLE);


SQLExecDirect(statementHandle, "{CALL sp_drv_locator_to_text(?)}", SQL_NTS); SQLFetch(statementHandle);

SQLGetData(statementHandle, 1,SQL_C_CHAR, description, descriptionLength, &descriptionLength)


Cout << "LOB data referenced by locator:"<< description

<< endl;


Cout << "Expected LOB data:A book on C++" << endl;

示例 6 将数据从客户端应用程序传输到 LOB 定位符。

description = "A lot of data that will be used for a lot

of inserts, updates and deletes"; descriptionLength = SQL_NTS;


SQLBindParameter(statementHandle, 1, SQL_PARAM_INPUT,

SQL_C_CHAR, SQL_CHAR, 512, 0, description, sizeof(description), &descriptionLength);


SQLExecDirect(statementHandle,


"{CALL sp_drv_create_text_locator(?)}", SQL_NTS); SQLFetch(statementHandle);

SQLGetData(statementHandle, SQL_C_TEXT_LOCATOR, TextLocator, sizeof(TextLocator),&Len);




--------------------------------------华丽的分割线-------------------------------------------------------------------------
之前就已经研发成功了能够从Sybase SQL Anywhere的DB文件中恢复数据的工具:ReadASADB。
此工具支持ASA v5.0,v6.0,v7.0,v8.0,v9.0,v10.0,v11.0,v12.0等版本。
恢复Sybase SQL Anywhere的工具在国内应该算首创。

ReadASADB功能
能够从损坏的SQL Anywhere数据文件(.db)和UltraLite数据文件(.udb)上提取数据的非常规恢复工具

  1. 适用于所有的SQL Anywhere版本    包括:5.x,6.x,7.x,8.x,9.x,10.x,11.x,12.x
  2. 适用于所有的UltraLite版本
  3. 能够恢复出来表结构和数据
  4. 能够恢复自定义数据类型
  5. 能够恢复存储过程等对象的语法
  6. 能够导出到目标数据库
  7. 能够导出到SQL文件并生成导入脚本
  8. 支持多种字符集  包括:cp850、cp936、gb18030、utf8等
  9. 能够恢复未加密或者简单加密类型的数据
  10. 简单易用
  11. 限制:不支持AES加密的数据文件
请参考:研发成功了从Sybase SQL Anywhere的DB文件上恢复数据的工具
            SQL Anywhere数据库非常规恢复工具ReadASADB使用介绍

ReadASADB适用场景

各种误操作:

  1. 误截断表(truncate table)
  2. 误删除表(drop table)
  3. 错误的where条件误删数据
  4. 误删除db或log文件
  5. 误删除表中的字段

本工具的应用场景:

1.因为物理磁盘故障、操作系统、系统软件方面或者掉电等等原因导致的Sybase SQL Anywhere数据库无法打开的情况;
2.误操作,包括truncate table,drop table,不正确的where条件导致的误删除等;
Sybase SQL Anywhere无法打开时,比较常见的错误是:Assertion failed。
如:
1、Internal database error *** ERROR *** Assertion failed:201819 (8.0.1.2600) Checkpoint log: invalid bitmap page -- transaction rolled back
2、Internal database error *** ERROR *** Assertion failed:201819 (8.0.1.2600) Page number on page does not match page requested -- transaction rolled back
3、Internal database error *** ERROR *** Assertion failed:200502 (9.0.2.2451) Checksum failure on page 23 -- transaction rolled back
4、File is shorter than expected
5、Internal database error *** ERROR *** Assertion failed: 201116 Invalid free list index page found while processing checkpoint log -- transaction rolled back
6、*** ERROR *** Assertion failed: 51901 Page for requested record not a table page or record not present on page等等。
+-------------------------------------华丽的分割线-------------------------------------------------------------------------