返回首页

gbase数据、南大通用产品文档:GBase8sifx_lo_writewithseek() 函数

更新日期:2024年09月11日

ifx_lo_writewithseek() 函数执行搜寻操作,然后将指定字节数的数据写到打开的
智能大对象。

语法
mint ifx_lo_writewithseek(LO_fd, buf, nbytes, offset, whence, error)
mint LO_fd;
char *buf;
mint nbytes;

GBase 8s ESQL/C 编程指南
南大通用数据技术股份有限公司
- 809 -

ifx_int8_t *offset;
mint whence;
mint *error;
LO_fd
表示要写到其的智能大对象的 LO 文件描述符。
buf
指向包含函数写到智能大对象的数据的缓冲区的指针。
nbytes
要写到智能大对象的字节数。此值不可超过 2 GB。
offset
指向从其起始的搜寻位置的 8 字节整数(INT8)偏移量的指针。
whence
标识起始的搜寻位置的 mint 值。
error
指向包含 ifx_lo_writewithseek() 设置的错误代码的 mint 的指针。

用法
ifx_lo_writewithseek() 函数将 nbytes 的数据写到 LO_fd 文件描述符标识的智能大对
象。该函数从 buf 指向的用户定义的缓冲区取得要写的数据。该缓冲区的大小必须小于 2
GB。

在 offset 和 whence 参数指示的 LO_fd 的搜寻位置开始写,如下:
whence 参数标识从其开始搜寻的位置。

有效的值包括下列 locator.h 头文件定义的常量。
Whence 常量
起始的搜寻位置。
LO_SEEK_SET
智能大对象的起始
LO_SEEK_CUR
智能大对象中的当前搜寻位置
LO_SEEK_END

GBase 8s ESQL/C 编程指南
南大通用数据技术股份有限公司
- 810 -

智能大对象的末尾
offset 参数标识以字节计的偏移量,从(whence 参数指定的)起始的搜寻位置,至应
设置的搜寻位置。

如果数据库服务器将少于 nbytes 的数据写到智能大对象,则 ifx_lo_writewithseek()
函数返回它写了的字节数,并设置 error 值来指向表示未完成的写操作的原因的值。当
sbspace 用尽空间时,可发生此情况。

返回代码
>=0
该函数已从 buf 字符缓冲区写到智能大对象的字节数。
-1
函数不成功;要获取详尽的错误代码,请检测 error。

前面的主题描述了用于创建不包含现有 Java™ 类的新的不透明类型的方法。从现有 Java
代码创建不透明类型时,请指定不透明类型中包含的 SQL 名称、JAR 文件 SQL 名称、
支持的 UDR(如果有)和任何其他不支持的 UDR。
(有关 SQL 名称的解释,请参阅SQL
名称。)还可以指定长度、对齐方式、隐式和显式强制转换。
要从现有的代码创建不透明类型。请使用以下方法:

UDTMetaData.setSQLName() 指定 SQL 语句中引用的不透明类型的 SQL 名称

对于不透明类型中支持的 UDR 使用 UDTMetaData.setSupportUDR()
支持的 UDR 为输入/输出、发送/接收等等。

对于不透明类型中不支持的 UDR 使用 UDTMetaData.setUDR()

UDTMetaData.setJarFileSQLName() 指定 JAR 文件的 SQL 名称

UDTMetaData.setImplicitCast() 或 UDTMetaData.setExplicitCast() 指定强制转换

GBase 8s JDBC Driver 程序员指南
南大通用数据技术股份有限公司
- 181 -


如果不透明类型是固定长度的,
使用 UDTMetaData.setLength()
(驱动程序缺省为可
变长度)

UDTMetaData.setAlignment() 指定不透明类型所对齐的字节边界(仅当您不希望数
据库服务器默认 4 字节边界时)

UDTManager.createJar() 创建 JAR(.jar)文件(如果没有)

UDTManager.createUDT() 创建不透明类型
另外,
setXXXCast() 、
setSupportUDR() 和 setUDR() 方法仅用于从现有代码创建不透明类型:

public void setImplicitCast(int ifxtype, String methodsqlname)
throws SQLException
public void setExplicitCast(int ifxtype, String methodsqlname)
throws SQLException
public void setSupportUDR(Method method, String sqlname, int type)
throws SQLException
public void setUDR(Method method, String sqlname)
throws SQLException
setXXXCast() 方法
setXXXCast() 方法指定显式或隐式将不透明类型转换为指定的数据类型。
ifxtype 参数是类 com.gbasedbt.lang.IfxTypes 的类型代码。数据库服务器中的 ifxtype 参数和
SQL 类型之间的数据类型映射在映射转换类型中进行了详细说明。methodsqlname 参数是
实现此转换的 Java™ 方法的 SQL 名称。
以下示例使用 SQL 名称 circle2_input 设置由 Java 方法实现的隐式转换:
setImplicitCast(com.gbasedbt.lang.IfxTypes.IFX_TYPE_LVARCHAR,
"circle2_input");
以下示例使用 SQL 名称 circle_output 设置由 Java 方法实现的显式转换:
setExplicitCast(com.gbasedbt.lang.IfxTypes.IFX_TYPE_LVARCHAR,
"circle2_output");
以下示例设置一个显式转换,将 circle2 不透明类型转换为整数:
setExplicitCast(com.gbasedbt.lang.IfxTypes.IFX_TYPE_INT,
"circle2_to_int");
setSupportUDR() 和 setUDR() 方法
setSupportUDR() 方法在现有 Java™ 类中指定 Java 方法,该类将被注册为不透明类型支持
的 UDR。
method 参数指定 java.lang.reflect.Method 中的一个对象,
将其注册为数据库服务中不透明类
型的 Java 支持 UDR。支持的 UDR 为输入、输出、发送、接收等等。(有关更多信息,
请参阅 GBase 8s 用户定义的例程和数据类型开发者指南 。)

GBase 8s JDBC Driver 程序员指南
南大通用数据技术股份有限公司
- 182 -

sqlname 参数指定方法的 SQL 名。有关更多信息,请参阅 SQL 名称。
type 参数指定支持的 UDR 的类型。如下所示:
UDTMetaData.INPUT
UDTMetaData.OUTPUT
UDTMetaData.SEND
UDTMetaData.RECEIVE
UDTMetaData.IMPORT
UDTMetaData.EXPORT
UDTMetaData.BINARYIMPORT
UDTMetaData.BINARYEXPORT
有关如何从现有代码创建不透明类型的操作步骤,请参阅从现有 Java 类创建不透明类型。

提示: 不必注册 SQLData 接口中方法。例如,您不需注册 SQLData.getSQLTypeName() 、
SQLData.readSQL() 或 SQLData.writeSQL()。
要指定其他 UDR,使用创建 UDR 中描述的 setUDR()。

要从一致性检查获取最大好处并确保数据库空间备份的完整性,必须定期执行以下操作:

验证所有数据和数据库服务器开销信息是一致的。

检查消息日志是否在您验证一致性时有断言失败。

在您验证一致性后创建 0 级数据库空间备份。
以下主题描述了其中每个操作。
验证一致性
由于此检查需要一定时间并且此检查可能导致争用,因此请将此检查调度为在活动最少的
时候执行。必须在创建 0 级备份之前执行此检查。
运行下表中显示的命令以作为一致性检查的一部分。
表 1. 检查数据一致性

GBase 8s 管理员指南
南大通用数据技术股份有限公司
- 332 -
验证类型
命令
系统目录表
oncheck -cc
数据
oncheck -cD dbname
扩展数据块数
oncheck -ce
索引
oncheck -cI dbname
保留页
oncheck -cr
逻辑日志和保留页
oncheck -cR
元数据和智能大对象
oncheck -cs
您可以在数据库服务器处于联机方式时运行这些命令中的每个命令。有关每个命令如何在
检查对象时锁定它们以及哪些用户可以执行验证的信息,请参阅 《GBase 8s 管理员参
考》 中的 oncheck。
在大多数情况下,如果这些验证过程中的一个或多个过程检测到错误,那么解决方案是从
数据库空间备份复原数据库。但是,错误的来源也可能是硬件或操作系统。
验证系统目录表
要验证系统目录表,使用 oncheck -cc 命令。
每个数据库包含它本身的系统目录,该目录包含有关数据库表、列、索引、视图、约束、
存储过程和特权的信息。
如果当验证完成时显示警告,那么该警告的唯一用途是提醒您找不到特定类型的记录。这
些警告并非指示您的数据、系统目录或甚至数据库设计有任何问题。该警告仅指示不存在
任何表的同义词;即,系统目录在表 syssyntable 中不包含记录。 例如,如果您为没有为
任何表定义同义词的数据库验证系统目录表,那么可能显示以下警告:
WARNING: No syssyntable records found.
但是,如果您在验证系统目录表时接收到错误消息,那么情况就完全不同了。请立即
与 GBase 8s 技术支持联系。
验证数据页
要确认数据页,请使用 oncheck -cD 命令。
如果数据页验证检测到错误,请尝试从指定表中卸载数据,删除该表,重新创建该表,并
重新装入该数据。
验证扩展数据块
要确认每个数据库中的扩展数据块,请使用 oncheck -ce 命令。

GBase 8s 管理员指南
南大通用数据技术股份有限公司
- 333 -
扩展数据块一定不能重叠。如果该命令检测到错误,请从存储空间备份执行数据复原。
验证索引
如果索引已损坏,那么数据库服务器在查询中将无法使用索引。
可以通过使用 oncheck -cI 命令来验证数据库中每个表上的索引。
此外,调度程序任务 bad_index_alert 将查找已被服务器标记为已损坏的索引。此任务在
每晚运行。对于此任务找到的每个已损坏索引,都会在 sysadmin:ph_alert 表中建立一个
条目。
如果索引已损坏,请将其删除,然后重新创建。
验证逻辑日志
要确认逻辑日志和保留页,请使用 oncheck -cR 命令。
验证保留页
要确认保留页,请使用 oncheck -cr 命令。
保留页是位于根数据库空间初始块开始处的页。这些页包含主数据库服务器开销信息。如
果该命令检测到错误,请从存储空间备份执行数据复原。
该命令可能会提供警告。在大多数情况下,这些警告让您注意的是您已经知道的情况。
验证元数据
对每个数据库运行 oncheck -cs 以验证数据库中所有智能大对象的元数据。如有必要,从
数据库空间备份复原数据。
监视数据不一致性
如果一致性检查代码在数据库服务器操作期间检测到不一致,将向数据库服务器消息日志
报告断言失败。(请参阅《GBase 8s 管理员参考》中的消息日志主题。)
消息日志和转储文件中的读断言失败
以下示例显示断言失败在消息日志中采用的格式。
Assert Failed: Short description of what failed
Who: Description of user/session/thread running at the time
Result: State of the affected database server entity
Action: What action the database server administrator should take
See Also: file(s) containing additional diagnostics
See Also: 行中包含以下一个或多个文件名:

af.xxx

shmem.xxx

gcore.xxx

GBase 8s 管理员指南
南大通用数据技术股份有限公司
- 334 -

gcore.xxx

/path name/core
在所有情况中,xxx 对与单个线程的断言失败相关联的所有文件而言是一个公共的十六进
制数。文件 af.xxx、shmem.xxx 和 gcore.xxx 位于 ONCONFIG 参数 DUMPDIR 指定的目
录下。
文件 af.xxx 包含发送到消息日志的断言失败消息的副本以及当前相关结构和数据缓冲区的
内容。
仅当 ONCONFIG 参数 DUMPSHMEM 设置为 1 或 2 时,文件 shmem.xxx 才包含断言失
败时数据库服务器共享内存的完整副本。
仅限 UNIX: 在 UNIX™ 上,仅当 ONCONFIG 参数 DUMPGCORE 设置为 1 且您的操
作系统支持 gcore 实用程序时,gcore.xxx 才包含数据库服务器虚拟进程(线程此时在其上
运行)的核心转储。仅当 ONCONFIG 参数 DUMPCORE 设置为 1 时,core 才包含数据
库服务器虚拟进程(线程此时在其上运行)的核心转储。core 文件的路径名是上次调用数
据库服务器的目录。
验证表和表空间数据
要验证表和表空间数据,请对数据库或表使用 oncheck -cD 命令。
大多数的一般断言失败消息后面均跟随其他信息,其他信息通常包含检测到错误的表空
间。如果此检查确认存在不一致情况,请从表中卸载数据,删除该表,重新创建该表,并
重新装入该数据。否则,无需执行其他任何操作。
在许多情况中,数据库服务器当断言失败时会立即停止。但是,当失败看起来是特定于某
个表或较小实体时,数据库服务器会继续运行。
当断言是由于数据库服务器代表用户访问的数据页上的不一致而失败时,还会将错误发送
至应用程序进程。SQL 错误取决于正在进行的操作。但是,ISAM错误几乎始终是 -105
或 -172,如下所示:
-105 ISAM error: bad isam file format
-172 ISAM error: Unexpected internal error
有关消息的目标和内容的更多详细信息,请参阅《GBase 8s 管理员参考》中有关消息日
志消息的主题。
保留一致的 0 级备份
在您执行验证一致性中描述的检查而不出错之后,请创建 0 级备份。保留该存储空间备
份和所有后续的逻辑日志备份磁带,直至您完成下一次一致性检查。请在每次 0 级备份
之前执行一致性检查。如果不这样做,那么至少保留所有从存储空间备份恢复所需的磁
带,该备份是在验证数据库服务器一致之后立即创建的。


GBase 8s 管理员指南
南大通用数据技术股份有限公司
- 335 -