外部数据类型¶
ACCI应用程序通过使用外部数据类型与神通数据库服务器通信。具体来说,外部数据类型映射到c++数据类型。
表4-1列出了神通外部数据类型、c++等效数据类型以及相应的ACCI类型。注意以下条件:
在c++数据类型列中,n代表可变长度,取决于程序要求或操作系统。
Statement 类方法中类型的用法如下:
- setDataBuffer():在acciCommon.h文件中,只有ACCI_SQLT_xxx形式的类型(例如,ACCI_SQLT_INT)是允许的。
- registerOutParam():在acciCommon.h文件中,只有ACCIxxx格式(例如ACCIDOUBLE、ACCICURSOR等)是允许的。但是,也有一些例外:ACCIANYDATA、ACCIMETADATA、ACCISTREAM和ACCIBOOL是不允许的。
在ResultSet类中,只有acciCommon.h文件中的ACCI_SQLT_xxx形式的类型(例如,ACCI_SQLT_INT)允许在setDataBuffer()和setDataBufferArray()方法中使用。
TIMESTAMP WITH TIME ZONE和TIMESTAMP类型的数据统称为日期。INTERVAL YEAR TO MONTH 和INTERVAL DAY TO SECOND统称为间隔。
表4-1 外部数据类型以及相应的c++和ACCI类型
| 外部数据类型 | C++类型 | ACCI类型 |
|---|---|---|
| 16位signed INTEGER | signed short,signed int | ACCIINT |
| 32位signed INTEGER | signed int,signed long | |
| 8位signed INTEGER | signed char | |
| BFILE | Bfile | ACCIBFILE |
| BLOB | ACILobLocator | ACCI_SQLT_BLOB |
| Blob | ACCIBLOB | |
| BOOL | bool | ACCIBOOL |
| BYTES | Bytes | ACCIBYTES |
| CHAR | char[n] | ACCI_SQLT_AFC |
| string | ACCICHAR | |
| CLOB | ACILobLocator | ACCI_SQLT_CLOB |
| Clob | ACCICLOB | |
| CURSOR | ResultSet | ACCICURSOR |
| DATE | char[7] | ACCI_SQLT_DATE |
| Date | ACCIDATE | |
| DOUBLE | double | ACCIDOUBLE |
| FLOAT | float,double | ACCIFLOAT |
| INT | int | ACCIINT |
| INTERVAL DAY TO SECOND | char[11] | ACCI_SQLT_INTERVAL_DS |
| INTERVAL YEAR TO MONTH | char[5] | ACCI_SQLT_INTERVAL_YM |
| INTERVAL | IntervalDS | ACCIINTERVALDS |
| INTERVALYM | IntervalYM | ACCIINTERVALYM |
| LONG | char[n] | ACCI_SQLT_LNG |
| LONG RAW | unsigned char[n] | ACCI_SQLT_LBI |
| LONG VARCHAR | char[n+sizeof(integer)] | ACCI_SQLT_LVC |
| LONG VARRAW | unsigned char[n+sizeof(integer)] | ACCI_SQLT_LVB |
| METADATA | MetaData | ACCIMETADATA |
| NAMED DATA TYPE | struct | ACCI_SQLT_NTY |
| NATIVE DOUBLE | double,Bdouble | ACCIBDOUBLE |
| NATIVE FLOAT | BFloat float | ACCIBFLOAT |
| NUMBER | unsigned char[21] | ACCI_SQLT_NUM |
| Number | ACCINUMBER | |
| RAW | unsigned char[n] | ACCI_SQLT_BIN |
| REF | ACIRef | ACCI_SQLT_REF |
| Ref | ACCIREF | |
| REFANY | RefAny | ACCIREFANY |
| ROWID | ACIRowid | ACCI_SQLT_RID |
| Bytes | ACCIROWID | |
| STRING | STL string | ACCISTRING |
| TIMESTAMP | Timestamp | ACCITIMESTAMP |
|
char[7] | ACCI_SQLT_TOMESTA_MP_LTZ |
| TIMESTAMP WITH TIME ZONE | char[13] | ACCI_SQLT_TIMESTA_MP_TZ |
| UNSIGNED INT | unsigned int | ACCIUNSIGNED_INT |
| VARCHAR | char[n+sizeof(short integar)] | ACCI_SQLT_VCS |
| VARCAHR2 | char[n] | ACCI_SQLT_CHR |
| VARRAW | unsigned char [n+sizeof(short integar)] | ACCI_SQLT_VBI |
| VECTOR | STL vector | ACCIVECTOR |
外部数据类型的描述¶
本节提供了每一种外部数据类型的描述.
BEFILE¶
外部数据类型BFILE允许对数据库服务器文件系统上的大文件进行只读字节流访问。BFILE是存储在数据库表空间之外的操作系统文件中的大型二进制数据对象。这些文件使用引用语义。如果底层服务器操作系统支持流模式访问这些操作系统文件,神通服务器可以访问BFILE。
BDOUBLE¶
ACCI中的BDouble接口封装了本机double数据和binary_double类型的列或对象属性的NULL信息。ResultSet类和Statement类中的ACCI方法,以及接受这些类对象作为参数的全局方法,对BDOUBLE数据类型使用以下定义:
struct BDouble
{
double value;
bool isNull;
BDouble()
{
isNull = false;
value = 0.;
}
};
BFLOAT¶
ACCI中的BFloat接口封装了原生的float数据和binary_float类型的列或对象属性的NULL信息。ResultSet类和Statement类中的ACCI方法,以及接受这些类对象作为参数的全局方法,使用以下BFLOAT数据类型的定义:
struct BFloat
{
float value;
bool isNull;
BFloat()
{
isNull = false;
value = 0.;
}
};
BLOB¶
外部数据类型BLOB存储非结构化二进制大对象。一个BLOB可以被认为是一个没有字符集语义的bit stream。BLOB可以存储高达4GB的二进制数据。
BLOB数据类型具有完整的事务支持。通过ACCI所做的更改将完全参与事务。可以提交或回滚BLOB value操作。您不能将BLOB定位器保存在一个事务中的变量中,然后在另一个事务或会话中使用它。
CHAR¶
外部数据类型CHAR是一个字符字符串,最大长度为2000个字符。
CHARZ¶
外部数据类型CHARZ类似于CHAR数据类型,不同的是字符串在输入时必须以NULL结尾,并且神通在输出时将NULL结束符放在字符串的末尾。空终止符仅用于输入或输出时分隔字符串。它不是表中数据的一部分。
CLOB¶
外部数据类型CLOB存储固定宽度或可变宽度字符数据。一个CLOB可以存储最多4 gb的字符数据。clob具有完全的事务支持。通过ACCI所做的更改将完全参与事务。CLOB值操作可以提交或回滚。您不能将CLOB定位器保存在一个事务中的变量中,然后在另一个事务或会话中使用它。
DATE¶
外部数据类型DATE可以使用神通内部7字节DATE二进制格式更新、插入或检索日期值。
FLOAT¶
外部数据类型FLOAT处理小数部分的数字。数字以主机系统的浮点格式表示。通常,长度是4或8字节。
神通数字的内部格式是十进制。大多数浮点实现都是二进制的。因此,神通表示的数字比浮点表示的精度更高。
INTEGRE¶
外部数据类型INTEGER用于转换数字。一个外部整数是一个带符号的二进制数。它的大小取决于操作系统。如果从神通返回的数字不是整数,则丢弃小数部分,不返回错误。如果返回的数字超过系统的带符号整数的容量,则神通在转换错误时返回一个溢出。
在FLOAT和NUMBER之间进行转换时可能会出现舍入错误。在查询中使用FLOAT作为绑定变量可能会返回错误。您可以通过将浮点数转换为字符串并对操作使用ACCI类型ACCI_SQLT_CHR或ACCI类型ACCI_SQLT_STR来解决这个问题。
INTERVAL DAY TO SECOND¶
外部数据类型INTERVAL DAY TO SECOND存储两个时间值(天、小时、分钟和秒)之间的差值。如下所示指定该数据类型:
INTERVAL DAY [(day_precision)]
TO SECOND [(fractional_seconds_precision)]
这个例子使用了以下占位符:
- day_precision:日期时间字段中的位数。接受的值是1到9。默认值是2。
- fractional_seconds_precision:第二个日期时间字段的小数部分的位数。接受的值是0到9。默认值是6。
INTERVAL YEAR TO MONTH¶
外部数据类型INTERVAL YEAR TO MONTH通过使用YEAR和MONTH 的日期字段存储两个日期值之间的差值。指定间隔年至月如下:
INTERVAL YEAR [(year_precision)] TO MONTH
占位符year_precision是YEAR 日期字段中的位数。year_precision的默认值是2。若要使用非默认year_precision指定从年到月的时间间隔文字,必须在文字中指定精度。例如,下面的INTERVAL YEAR TO MONTH字面量表示的是一个123年2个月的间隔:
INTERVAL '123-2' YEAR(3) TO MONTH
LONG¶
外部数据类型LONG在数据类型LONG的列中存储超过4000字节和最多2g的字符串。这种类型的列仅用于存储和检索long字符串。它们不能用在方法、表达式或WHERE子句中。LONG列值通常在字符串和长列值之间进行转换。
LONG RAW¶
外部数据类型LONG RAW类似于外部数据类型RAW,不同之处是它最多存储2 gb。
LONG VARCHAR¶
外部数据类型LONG VARCHAR将数据存储在神通LONG列中。前四个字节包含项的长度。LONG VARCHAR的最大长度是2g。
NUMBER¶
不推荐NUMBER用作外部数据类型。如果使用它,神通将返回内部21字节二进制格式的数值,并期望输入时使用这种格式。
神通以变长格式存储NUMBER数据类型的值。第一个字节是指数,后面跟着1到20个尾数字节。指数字节的高阶位是符号位;它被设置为正数,并被清除为负数。后7位表示指数
注意,这个数据类型不同于ACCI NUMBER, ACCI NUMBER对应于c++ Number数据类型。
RAW¶
外部数据类型RAW用于不被神通解释或处理的二进制数据或字节字符串。例如,RAW可以用于图形字符序列。原始列的最大长度是2000字节。
当神通表中的原始数据转换为字符串时,数据将以十六进制代码表示。原始数据的每个字节表示为两个字符,表示字节的值,范围从00到FF。如果使用RAW输入字符串,则必须使用十六进制编码。
REF¶
外部数据类型REF是对指定数据类型的引用。要分配REF在应用程序中使用,请将变量声明为指向REF的指针。
ROWID¶
外部数据类型ROWID标识数据库表中的特定行。ROWID通常通过类似于下面例子的语句从查询中返回:
SELECT ROWID, var1, var2 FROM db;
然后可以在进一步的DELETE语句中使用返回的ROWID。
如果您正在为更新操作执行SELECT操作,则会隐式返回ROWID。
STRING¶
外部数据类型字符串的行为类似于外部数据类型VARCHAR2(数据类型代码1),除了外部数据类型字符串必须以空字符结束之外。
注意,这种数据类型不同于OCCI STRING,ACCI STRING对应于c++ STL string数据类型。
TIMESTAMP¶
外部数据类型TIMESTAMP是DATE数据类型的扩展。它存储日期数据类型的年、月和日,以及小时、分钟和秒值。指定时间戳数据类型如下:
TIMESTAMP [(fractional_seconds_precision)]
占位符fractional_seconds_precision可选指定第二个datetime字段的小数部分的位数,可以是0到9之间的数字。默认值是6。例如,你可以这样指定TIMESTAMP(2):
TIMESTAMP '1997-01-31 09:26:50.10'
TIMESTAMP WITH LOCAL TIME ZONE¶
外部数据类型TIMESTAMP WITH TIME ZONE (TSTZ)是TIMESTAMP的一种变体,其值中包含显式的时区位移。时区位移是当地时间和协调世界时(UTC)(以前的格林威治标准时间)之间的差值(以小时和分钟为单位)。使用TIMESTAMP WITH TIME ZONE数据类型,如下所示:
TIMESTAMP(fractional_seconds_precision) WITH TIME ZONE
占位符fractional_seconds_precision可选指定第二个datetime字段的小数部分的位数,可以是0到9之间的数字。默认值是6。
如果两个带有时区值的时间戳在UTC中表示同一时刻,则认为它们是相同的,而不管数据中存储的时区偏移量如何。
TIMESTAMP WITH TIME ZONE¶
外部数据类型TIMESTAMP WITH TIME ZONE是TIMESTAMP的变体,其值中包含时区位移。时区位移是当地时间和协调世界时(UTC)(以前的格林威治标准时间)之间的差值(以小时和分钟为单位)。使用时区数据类型指定时间戳,如下所示:
TIMESTAMP [(fractional_seconds_precision)] WITH TIME ZONE
占位符fractional_seconds_precision可选指定第二个datetime字段的小数部分的位数,可以是0到9之间的数字。默认值是6。
UNSIGNED INT¶
外部数据类型UNSIGNED INT用于UNSIGNED二进制整数。以字节为单位的大小取决于操作系统。主机系统架构决定字中字节的顺序。如果从神通输出的数字不是整数,那么小数部分将被丢弃,并且不会返回错误。如果返回的数字超过操作系统的无符号整数的容量,神通将在转换错误时返回一个溢出。
VARCHAR¶
外部数据类型VARCHAR存储可变长度的字符串。前两个字节包含字符串的长度,其余字节包含实际的字符串。绑定或定义调用中的字符串的指定长度必须包括两个长度字节,这意味着最大的VARCHAR字符串的长度是65533字节,而不是65535字节。对于转换较长的字符串,请使用较长的VARCHAR外部数据类型。
VARCHAR2¶
外部数据类型VARCHAR2是一个长度可变的字符串,最多4000字节。
VARNUM¶
是一个外部数据类型VARNUM类似于外部数据类型NUMBER,不同的是第一个字节包含数字表示的长度。这个长度值不包括长度字节本身。保留22个字节以接收尽可能长的VARNUM。在向数据库发送VARNUM值时,必须设置长度字节。
VARRAW¶
外部数据类型VARRAW类似于外部数据类型RAW,不同的是前两个字节包含数据的长度。绑定或定义调用中的字符串的指定长度必须包括两个长度字节。所以可以接收或发送的最大VARRAW字符串是65533字节,而不是65535字节。对于转换较长的字符串,请使用LONG VARRAW数据类型。
NATIVE DOUBLE¶
须包括两个长度字节。所以可以接收或发送的最大VARRAW字符串是65533字节,而不是65535字节。这个外部数据类型实现IEEE 754标准双精度浮点数据类型。它以主机系统的本机浮点格式表示。该数据类型在神通服务器中以一种字节可比的规范格式存储,需要8字节的存储,包括长度字节。它是神通NUMBER的替代方案,与NUMBER相比有以下优点:
- 存储中使用的字节更少
- 匹配RDBMS客户端使用的数据类型
- 支持科学计算中使用的更广泛的数值范围。
NATIVE FLOAT¶
这个外部数据类型实现IEEE 754单精度浮点数据类型。它以主机系统的本机浮点格式表示。该数据类型在神通服务器中以一种字节可比的规范格式存储,需要4个字节(包括长度字节)来存储。它是神通acle NUMBER的替代方案,与NUMBER相比有以下优点:
- 存储中使用的字节更少
- 匹配RDBMS客户端使用的数据类型
- 支持科学计算中使用的更广泛的数值范围。