外部数据类型

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
TIMESTAMP WITH LOCAL
TIME ZONE
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客户端使用的数据类型
  • 支持科学计算中使用的更广泛的数值范围。