ORACLE官方SQL语言参考笔记之Oracle SQL的基本元素篇(第三章-第一节-数据类型)

本文简述

此书下载方法:加入群技术交流群(免费)699712384,文件夹为ORACLE官方文档中 
CSDN技术网址 
简书技术网址 
ORACLE官网教程地址 
书名:

中文名:《SQL语言参考笔记》

英文名:《SQL Language Reference》

作者:二次猿

时间:阅读于2018年3月21日

准备工作:详情见:具体可以参考简书和二次猿公众号常用表

注意事项:跳过基本概念和非重要内容,重点举例说明,并且加粗,部分内容可能在其他章节会再次详细介绍,表格如果排版不美观,可以复制到excle进行直观展示,代码部分根据实际情况注释和说明

数据类型

Oracle 数据库操作的每个值都具有数据类型值的数据类型将一组固定属性与该值关联。这些属性会导致 Oracle 将某种数据类型的值与其他值不同。例如, 您可以添加NUMBER数据类型的值, 而不是RAW数据类型的值。

创建表或群集时, 必须为每个列指定数据类型。创建过程或存储函数时, 必须为每个参数指定数据类型。这些数据类型定义了每个列可以包含的值的域或每个参数都可以有。例如, DATE列不能接受2月29日的值 (闰年除外) 或值2或 "鞋"。随后放置在列中的每个值都假定列的数据类型。例如, 如果将'01-JAN-98'插入DATE列中, 则 Oracle 在验证它转换为有效日期后, 将'01-JAN-98'字符串作为DATE值处理。

Oracle 数据库为可用作数据类型的用户定义类型提供了许多内置数据类型以及多个类别。Oracle 数据类型的语法显示在下面的关系图中。本节的文本分为以下几节:

  • Oracle 内置数据类型

  • ANSI、DB2 和 SQL/DS 数据类型

  • 用户定义类型

  • Oracle 提供的类型

  • 数据类型比较规则

  • 数据转换

数据类型是标量或标量。标量类型包含一个原子值, 而标量 (有时称为 "集合") 包含一组值。大型对象 (LOB) 是一种特殊形式的标量数据类型, 表示二进制或字符数据的大标量值。lob 受某些限制的制约, 因为它们的大小不影响其他标量类型。这些限制是在相关 SQL 语法的上下文中记录的。

Oracle precompilers 识别嵌入式 SQL 程序中的其他数据类型。这些数据类型称为外部数据类型, 并与主机变量关联。不要将内置数据类型和用户定义类型与外部数据类型混淆。有关外部数据类型的信息, 包括 Oracle 如何在它们与内置数据类型或用户定义类型之间进行转换, 请参阅 Pro 程序员指南 Pro c/c++ 程序员指南.

数据::=

Description of datatypes.gif follows
插图 "数据类型 gif" 的说明

Oracle 内置数据类型显示在下面的数字中。有关说明, 请参阅"Oracle 内置数据类型".

Oracle_built_in_datatypes::=

Description of oracle_built_in_datatypes.gif follows
插图 "oracle_built_in_datatypes" 的说明

character_datatypes::=

Description of character_datatypes.gif follows
插图 "character_datatypes" 的说明

number_datatypes::=

Description of number_datatypes.gif follows
插图 "number_datatypes" 的说明

long_and_raw_datatypes::=

Description of long_and_raw_datatypes.gif follows
插图 "long_and_raw_datatypes" 的说明

datetime_datatypes::=

Description of datetime_datatypes.gif follows
插图 "datetime_datatypes" 的说明

large_object_datatypes::=

Description of large_object_datatypes.gif follows
插图 "large_object_datatypes" 的说明

rowid_datatypes::=

Description of rowid_datatypes.gif follows
插图 "rowid_datatypes" 的说明

ANSI 支持的数据类型显示在下面的图中。"ansi、DB2 和 SQL/DS 数据类型"讨论将 ANSI 支持的数据类型映射到 Oracle 内置数据类型。

ANSI_supported_datatypes::=

Description of ansi_supported_datatypes.gif follows
插图 "ansi_supported_datatypes" 的说明

有关用户定义类型的说明, 请参阅"用户定义类型".

Oracle 提供的数据类型显示在下面的数字中。有关说明, 请参阅"Oracle 提供的类型".

Oracle_supplied_types::=

Description of oracle_supplied_types.gif follows
插图 "oracle_supplied_types" 的说明

有关expression_filter_type的说明, 请参阅"表达式筛选器类型"其他 Oracle 提供的类型如下:

any_types::=

Description of any_types.gif follows
插图 "any_types" 的说明

有关Any类型的说明, 请参阅"任何类型".

XML_types::=

Description of xml_types.gif follows
插图 "xml_types" 的说明

有关 xml 类型的说明, 请参阅"XML 类型".

spatial_types::=

Description of spatial_types.gif follows
插图 "spatial_types" 的说明

有关空间类型的说明, 请参阅"空间类型".

media_types::=

Description of media_types.gif follows
插图 "media_types" 的说明

still_image_object_types::=

Description of still_image_object_types.gif follows
插图 "still_image_object_types" 的说明

有关媒体类型的说明, 请参阅"媒体类型".

Oracle 内置数据类型

下面的表总结了 Oracle 内置数据类型。有关语法元素, 请参阅前面各节中的语法。数据类型列出的代码由 Oracle 数据库内部使用。列或对象属性的数据类型代码由DUMP函数返回。

表3-1 内置数据类型摘要

代码 数据类型 描述

1

VARCHAR2(size [BYTE|CHAR])

具有最大长度size字节或字符的可变长度字符字符串。最大size为4000个字节或字符, 最小值为1字节或1个字符。您必须指定VARCHAR2size.

BYTE指示该列将具有字节长度语义。CHAR指示该列将具有字符语义。

1

NVARCHAR2(size)

具有最大长度size字符的可变长度 Unicode 字符字符串。UTF8编码的AL16UTF16编码和三倍size的字节数最多可以是两次size 。最大size由国家字符集定义确定, 上限为4000字节。您必须指定NVARCHAR2size.

2

NUMBER[(p [, s]) ]

具有精确p和缩放s的数字。精度p的范围可从1到38不等。缩放s的范围可从-84 到127不等。精度和刻度都是十进制数字。NUMBER值需要从1到22字节。

2

FLOAT[(p)]

具有精度pNUMBER数据类型的子类型。FLOAT值在内部表示为NUMBER精度p的范围可以是1到126个二进制数字。FLOAT值需要从1到22字节。

8

LONG

可变长度的字符数据, 可达 2 gb 或231-1 字节。提供了向后兼容性。

12

DATE

有效日期范围从 4712年1月1日 BC, 到 9999年12月31日 AD。默认格式由NLS_DATE_FORMAT参数显式确定, 或者由NLS_TERRITORY参数隐含。大小固定为7字节。此数据类型包含日期YEARMONTHDAYHOURMINUTESECOND它没有小数秒或时区。

100

BINARY_FLOAT

32位浮点数字。此数据类型需要4个字节。

101

BINARY_DOUBLE

64位浮点数字。此数据类型需要8个字节。

180

TIMESTAMP[(fractional_seconds_precision)]

日期的年、月和日值, 以及小时、分钟和第二个时间值, 其中fractional_seconds_precisionSECONDdatetime 字段的小数部分中的位数。fractional_seconds_precision的接受值为0到9。默认值为6。默认格式由NLS_TIMESTAMP_FORMAT参数显式确定, 或者由NLS_TERRITORY参数隐式决定。大小为7或11字节, 具体取决于精度。此数据类型包含日期YEARMONTHDAYHOURMINUTESECOND它包含小数秒, 但没有时区。

181

TIMESTAMP[(fractional_seconds_precision)]WITHTIMEZONE

TIMESTAMP的所有值以及时区置换值, 其中fractional_seconds_precisionSECONDdatetime 字段的小数部分中的位数。接受值为0到9。默认值为6。默认格式由NLS_TIMESTAMP_FORMAT参数显式确定, 或者由NLS_TERRITORY参数隐含。大小固定为13字节。此数据类型包含日期YEARMONTHDAYHOURMINUTESECOND、 TIMEZONE_HOURTIMEZONE_MINUTE它有小数秒和一个显式时区。

231

TIMESTAMP[(fractional_seconds_precision)]WITHLOCALTIMEZONE

TIMESTAMPWITHTIMEZONE的所有值, 但有以下例外:

  • 数据在数据库中存储时将被规范化到数据库时区。

  • 检索数据时, 用户将看到会话时区中的数据。

默认格式由NLS_TIMESTAMP_FORMAT参数显式确定, 或者由NLS_TERRITORY参数隐含。大小为7或11字节, 具体取决于精度。

182

INTERVALYEAR[(year_precision)]to TOMONTH

在年份和月份中存储一段时间, 其中year_precisionYEARdatetime 字段中的位数。接受值为0到9。默认值为2。大小固定为5字节。

183

INTERVALDAY[(day_precision)]to TOSECOND[(fractional_seconds_precision)]

以天、小时、分钟和秒为单位存储一段时间, 其中

  • day_precisionDAYdatetime 字段中的最大位数。接受值为0到9。默认值为2。

  • fractional_seconds_precisionSECOND字段的小数部分中的位数。接受值为0到9。默认值为6。

大小固定为11字节。

23

RAW(size)

长度为size字节的原始二进制数据。最大size为2000个字节。必须为RAW值指定size 。

24

LONG RAW

可变长度的原始二进制数据可达 2 gb。

69

ROWID

表示表中一行的唯一地址的基64字符串。此数据类型主要用于ROWID pseudocolumn 返回的值。

208

UROWID[size)]

表示索引组织表的行的逻辑地址的基64字符串。可选size是类型为UROWID的列的大小。最大大小和默认值为4000个字节。

96

CHAR[(size [BYTE|CHAR])]

长度为size的固定长度字符数据字节或字符。最大size为2000个字节或字符。默认值和最小size为1字节。

BYTECHARVARCHAR2具有相同的语义.

96

NCHAR[size)]

长度为size字符的固定长度字符数据。UTF8编码的AL16UTF16编码和三倍size的字节数最多可以是两次size 。最大size由国家字符集定义决定, 上限为2000年字节。默认值和最小size为1个字符。

112

CLOB

包含单字节或多字节字符的字符大对象。无论使用数据库字符集, 都支持固定宽度和可变宽度字符集。最大大小为 (4 gb-1) * (数据库块大小)。

112

NCLOB

包含 Unicode 字符的字符大对象。无论是使用数据库国家字符集, 都支持固定宽度和可变宽度字符集。最大大小为 (4 gb-1) * (数据库块大小)。存储国家字符集数据。

113

BLOB

二进制大对象。最大大小为 (4 gb-1) * (数据库块大小)。

114

BFILE

包含存储在数据库外部的大型二进制文件的定位器。对驻留在数据库服务器上的外部 lob 启用字节流 i/o 访问。最大大小为 4 gb。


下面的部分描述了 oracle 数据类型, 它们存储在 oracle 数据库中。有关将这些数据类型指定为文本的信息, 请参阅"文本".

字符数据类型

字符数据类型在数据库字符集或民族字符集中存储字符 (字母数字) 数据 (即单词和自由格式文本)。它们的限制性比其他数据类型少, 因此属性更少。例如, 字符列可以存储所有字母数字值, 但NUMBER列只能存储数值。

字符数据存储在字符串中, 其中的字节值对应于创建数据库时指定的字符集 (如7位 ASCII 或 EBCDIC)。Oracle 数据库同时支持单字节和多字节字符集。

这些数据类型用于字符数据:

  • CHAR 数据类型

  • NCHAR 数据类型

  • NVARCHAR2 数据类型

  • VARCHAR2 数据类型

有关将字符数据类型指定为文本的信息, 请参阅"文本文字".

CHAR 数据类型

CHAR数据类型指定一个固定长度的字符字符串。Oracle 确保存储在CHAR列中的所有值都具有size指定的长度。如果插入的值比列长短, 则 Oracle 将该值留空, 以列长度为数值。如果尝试插入的值对于列来说太长, 则 Oracle 将返回一个错误。

CHAR列的默认长度为1字节, 允许的最大值为2000字节。可以将1字节字符串插入到CHAR(10)列中, 但在存储之前, 该字符串的填充为10字节。

在创建具有CHAR列的表时, 默认情况下, 您提供的列长度为字节。BYTE限定符与默认值相同。如果使用CHAR限定符 (例如CHAR(10 CHAR)), 则可以在字符中提供列长度。字符在技术上是数据库字符集的代码点。它的大小可以从1字节到4字节不等, 具体取决于数据库字符集。BYTECHAR限定符重写由NLS_LENGTH_SEMANTICS参数指定的语义, 该语法具有字节语义的默认值。出于性能原因, Oracle 建议您使用NLS_LENGTH_SEMANTICS参数设置长度语义, 并且仅在需要重写参数时才使用BYTECHAR限定符。

若要确保具有不同字符集的数据库之间进行正确的数据转换, 必须确保CHAR数据由格式良好的字符串组成。

另请参见:

Oracle 数据库全球化支持指南有关字符集支持和"数据类型比较规则"的详细信息, 了解比较语义的信息

NCHAR 数据类型

NCHAR数据类型是仅 Unicode 的数据类型。当使用NCHAR列创建表时, 可以用字符定义列的长度。您在创建数据库时定义了国家字符集。

列的最大长度由国家字符集定义决定。字符数据类型的宽度规格NCHAR引用字符数。允许的最大列大小为2000字节。

如果插入的值比列长短, 则 Oracle 将该值留空, 以列长度为数值。不能将CHAR值插入NCHAR列中, 也不能将NCHAR值插入CHAR列中。

下面的示例将pm.product_descriptions表的translated_description列与一个全国性字符集字符串进行比较:

SELECT translated_description
  FROM product_descriptions
  WHERE translated_name = N'LCD Monitor 11/PM';

NVARCHAR2 数据类型

NVARCHAR2数据类型是仅 Unicode 的数据类型。当您使用NVARCHAR2列创建表时, 将提供它可以容纳的最大字符数。如果该值不超过列的最大长度, 则 Oracle 随后会将列中的每个值与您指定时完全存储在一起。

列的最大长度由国家字符集定义决定。字符数据类型的宽度规格NVARCHAR2是指字符数。允许的最大列大小为4000字节。

VARCHAR2 数据类型

VARCHAR2数据类型指定可变长度的字符串。当您创建VARCHAR2列时, 将提供它可以容纳的最大字节数或数据字符。如果该值不超过列的最大长度, 则 Oracle 随后会将列中的每个值与您指定的完全一样存储。如果尝试插入超过指定长度的值, 则 Oracle 将返回一个错误。

必须为VARCHAR2列指定最大长度。此最大值必须至少为1个字节, 但存储的实际字符串允许为零长度字符串 ('')。可以使用CHAR限定符 (例如VARCHAR2(10 CHAR)) 来提供字符的最大长度而不是字节。字符在技术上是数据库字符集的代码点。可以使用BYTE限定符 (例如VARCHAR2(10BYTE)) 显式提供最大长度 (以字节为单位)。如果在创建具有此列或属性的数据库对象时, 没有在列或属性定义中包含显式限定符, 则长度语义由创建会话的NLS_LENGTH_SEMANTICS参数的值确定该对象。与字符的最大长度无关, VARCHAR2数据的长度不能超过4000个字节。Oracle 使用 nonpadded 比较语义比较VARCHAR2值。

若要确保具有不同字符集的数据库之间进行正确的数据转换, 必须确保VARCHAR2数据由格式良好的字符串组成。有关字符集支持的更多信息, 请参见Oracle 数据库全球化支持指南 。

VARCHAR 数据类型

不要使用VARCHAR数据类型。请改用VARCHAR2数据类型。尽管VARCHAR数据类型当前与VARCHAR2是同义的, 但VARCHAR数据类型计划重新定义为用于可变长度字符串的单独数据类型, 比较不同的比较语义。

数字数据类型

Oracle 数据库数值数据类型存储正和负的固定和浮点数字、零、无穷大和值, 它们是操作的未定义结果-"不是数字" 或NAN有关将数值数据类型指定为文本的信息, 请参阅"数字文本".

数字数据类型

NUMBER数据类型存储零以及正数和负固定数字, 其绝对值从 1.0 x 10-130到, 但不包括 1.0 x 10126.如果指定的算术表达式的值的绝对值大于或等于 1.0 x 10126, 则 Oracle 将返回一个错误。每个NUMBER值都需要1到22个字节。

使用以下窗体指定固定点编号:

NUMBER(p,s)

地方:

  • p精度, 或者是最大的十进制数字个数, 其中最有效的数字是最左边的非零数字, 最有效的数字是最正确的数字。Oracle 保证数字的可移植性, 其精度高达 20 base-100 位, 这相当于39或40十进制数字, 具体取决于小数点的位置。

  • s刻度, 或者小数点的位数为最小有效数字。刻度可以从-84 到127不等。

    • 正刻度是小数点右边的有效位数, 并包括最小有效数字。

    • 负刻度是小数点左边的有效位数, 但不包括最小有效数字。对于负刻度, 最小有效数字位于小数点左侧, 因为实际数据四舍五入到小数点左边的指定数量的位置。例如, 规范 (10,-2) 意味着舍入到数以百计。

刻度可以大于精度, 最常见的是使用e表示法。当刻度大于精度时, 精度指定小数点右边的最大有效位数。例如, 定义为NUMBER(4,5)的列要求小数点后的第一个数字为零, 并在小数点后的第五位后舍入所有值。

在输入时, 指定定点编号列的刻度和精度以进行额外的完整性检查是很好的做法。指定刻度和精度不会将所有值强制为固定长度。如果值超出精度, 则 Oracle 将返回错误。如果某个值超出了比例, 则 Oracle 将对其进行舍入。

使用以下窗体指定整数:

NUMBER(p)

这表示具有精度p和缩放0的定点数字, 等效于NUMBER(p,0).

使用以下窗体指定浮点数字:

NUMBER 

缺少精度和刻度指示器指定 Oracle 数字的最大范围和精度。

表 3-2显示 Oracle 如何使用不同的精度和比例存储数据。

表3-2 规模和精度的存储

实际数据 指定为 存储为

123.89

NUMBER

123.89

123.89

NUMBER(3)

124

123.89

NUMBER(3,2)

超出精度

123.89

NUMBER(4,2)

超出精度

123.89

NUMBER(5,2)

123.89

123.89

NUMBER(6,1)

123。9

123.89

NUMBER(6,-2)

100

. 01234

NUMBER(4,5)

. 01234

. 00012

NUMBER(4,5)

. 00012

. 000127

NUMBER(4,5)

. 00013

. 0000012

NUMBER(2,7)

. 0000012

. 00000123

NUMBER(2,7)

. 0000012

1.2e-4

NUMBER(2,5)

0.00012

1.2e-5

NUMBER(2,5)

0.00001


浮动数据类型

FLOAT数据类型是NUMBER的子类型。它可以指定为或不具有精度, 它与NUMBER具有相同的定义, 并且可以介于1到126之间。无法指定刻度, 但从数据中进行解释。每个FLOAT值都需要1到22个字节。

若要从二进制转换为十进制精度, 请将n乘以0.30103。若要从十进制转换为二进制精度, 请将十进制精度乘以3.32193。126位二进制精度的最大值大致相当于十进制精度的38位数字。

通过示例, 最好说明NUMBERFLOAT之间的差异。在下面的示例中, 将相同的值插入到NUMBERFLOAT列中:

CREATE TABLE test (col1 NUMBER(5,2), col2 FLOAT(5));

INSERT INTO test VALUES (1.23, 1.23);
INSERT INTO test VALUES (7.89, 7.89);
INSERT INTO test VALUES (12.79, 12.79);
INSERT INTO test VALUES (123.45, 123.45);

SELECT * FROM test;

      COL1       COL2
---------- ----------
      1.23        1.2
      7.89        7.9
     12.79         13
    123.45        120

在此示例中, 返回的FLOAT值不能超过5个二进制数字。可由5个二进制数字表示的最大十进制数为31。最后一行包含超过31的十进制值。因此, 必须截断FLOAT值, 以便其有效数字不需要超过5个二进制数字。因而123.45 被四舍五入到 120, 只有两个重要的十进制数字, 只需要4个二进制数字。

在转换 ANSIFLOAT数据时, oracle 数据库在内部使用 oracle FLOAT数据类型。oracle FLOAT可供您使用, 但 oracle 建议您改用BINARY_FLOATBINARY_DOUBLE数据类型, 因为它们更健壮。有关详细信息, 请参阅"浮点数字" 。

浮点数字

浮点数字可以从第一个到最后一个数字的任何位置都有小数点, 或者根本就没有小数点。指数可以选择性地用于跟随数字增加范围, 例如, 1.777 e-20.刻度值不适用于浮点数字, 因为小数点后可以显示的位数不受限制。

在 Oracle 数据库内部存储值的方式中, 二进制浮点数字与NUMBER不同。值使用NUMBER的十进制精度存储。NUMBER支持的范围和精度内的所有文本都完全存储为NUMBER文本的存储完全是因为使用十进制精度 (数字0到 9) 表示文本。二进制浮点数字使用二进制精度 (数字0和 1) 存储。这样的存储方案不能完全使用十进制精度表示所有值。通常, 当值从二进制转换为十进制精度时, 在将值从十进制转换为二进制精度时发生的错误将被撤消。字面0.1 就是这样一个例子。

Oracle 数据库仅为浮点数字提供两个数值数据类型:

BINARY_FLOAT

BINARY_FLOAT是一个32位、单精度浮点数字数据类型。每个BINARY_FLOAT值都需要4个字节。

BINARY_DOUBLE

BINARY_DOUBLE是一个64位、双精度浮点数字数据类型。每个BINARY_DOUBLE值都需要8个字节。

NUMBER列中, 浮点数字具有十进制精度。BINARY_FLOATBINARY_DOUBLE列中, 浮点数字具有二进制精度。二进制浮点数字支持特殊值无穷大和NaN (不是数字)。

可以在表 3-3中列出的限制内指定浮点数字。指定浮点数字的格式在"数字文本"中定义.

表3-3 浮点数字限制

价值 BINARY_FLOAT BINARY_DOUBLE

最大正有限值

3.40282E + 38 楼

1.79769313486231E+308

最小正则有限值

1.17549E-38 楼

2.22507485850720E-308


IEEE754 一致性 Oracle 实现浮点数据类型与电气和电子工程师协会 (ieee) 的二进制浮点算术标准 (ieee 标准 754-1985 (IEEE754)) 基本相符。浮点数据类型符合以下区域中的 IEEE754:

  • SQL 函数SQRT实现了平方根。请参见SQRT.

  • SQL 函数REMAINDER实现余数。请参见余数.

  • 算术运算符符合。请参见算术运算符.

  • 比较运算符符合, 但与NaN的比较除外。对于所有其他值, Oracle 命令NaN最大, 并计算NaN等于NaN请参见"浮点条件".

  • 转换运算符符合。请参见"转换函数".

  • 支持默认舍入模式。

  • 支持默认的异常处理模式。

  • 支持特殊值INFINFNaN 。请参见"浮点条件".

  • BINARY_FLOATBINARY_DOUBLE值舍入到整数值BINARY_FLOATBINARY_DOUBLE值由 SQL 函数ROUND、 TRUNCCEIL和提供. FLOOR.

  • BINARY_FLOAT/BINARY_DOUBLE到十进制和十进制到BINARY_FLOAT/BINARY_DOUBLE的舍入由 SQL 函数TO_CHAR、 TO_NUMBER、 TO_NCHAR、 TO_BINARY_FLOAT、 TO_BINARY_DOUBLECAST.

浮点数据类型不符合以下区域中的 IEEE754:

  • -0 被强迫到 + 0。

  • 不支持与NaN进行比较。

  • 所有NaN值都被强制为BINARY_FLOAT_NANBINARY_DOUBLE_NAN.

  • 不支持非默认舍入模式。

  • 不支持非默认异常处理模式。

数值优先级

数值优先级确定对于支持数值数据类型的操作, 如果操作的参数具有不同的数据类型, 则 Oracle 所使用的数据类型。BINARY_DOUBLE具有最高的数字优先级, 后跟BINARY_FLOAT, 最后是NUMBER因此, 在对多个数值的任何操作中:

  • 如果任何操作数为BINARY_DOUBLE, 则在执行操作之前, Oracle 尝试将所有操作数隐式转换为BINARY_DOUBLE 。

  • 如果没有任何操作数是BINARY_DOUBLE , 但任何操作数都是BINARY_FLOAT, 则 Oracle 尝试在执行操作之前将所有操作数隐式转换为BINARY_FLOAT 。

  • 否则, Oracle 将尝试在执行操作之前将所有操作数转换为NUMBER

如果需要任何隐式转换并且失败, 则操作将失败。有关隐式转换的详细信息, 请参阅表 3-10 "隐式类型转换矩阵" 。

在其他数据类型的上下文中, 数值数据类型的优先级低于 datetime/间隔数据类型, 优先级高于字符和所有其他数据类型。

长数据类型

不要创建具有LONG列的表。改用 LOB 列 (CLOB、 NCLOB、 BLOB)。仅支持向后兼容性的LONG列。

LONG列存储包含最多 2 gb-1 或2的可变长度字符字符串31-1 字节。LONG列具有VARCHAR2列的许多特征。可以使用LONG列存储长文本字符串。LONG值的长度可能受计算机上可用内存的限制。LONG文本是按照"文本文字"所描述的那样形成的。.

Oracle 还建议将现有的LONG列转换为 LOB 列。LOB 列的限制要比LONG列少得多。此外, 每个版本中都增强了 LOB 功能, 而LONG功能对于多个版本是静态的。有关将LONG列转换为 LOB 的详细信息, 请参阅更改表TO_LOBmodify_col_properties子句。

可以在这些位置的 SQL 语句中引用LONG列:

  • SELECT列表

  • UPDATE语句的SET子句

  • INSERT语句的VALUES子句

LONG值的使用受这些限制的约束:

  • 表只能包含一个LONG列。

  • 不能使用LONG属性创建对象类型。

  • LONG列不能出现在WHERE子句或完整性约束中 (除非它们可以出现在NULLNOT NULL的限制中)。

  • 不能对LONG列进行索引。

  • 不能在正则表达式中指定LONG数据。

  • 存储函数不能返回LONG值。

  • 可以使用LONG数据类型声明 PL/SQL 程序单元的变量或参数。但是, 您不能从 SQL 调用程序单元。

  • 在单个 SQL 语句中, 所有LONG列、更新表和锁定表都必须位于同一数据库中。

  • LONGLONG RAW列不能在分布式 SQL 语句中使用, 无法复制。

  • 如果表同时具有LONG和 lob 列, 则不能将超过4000字节的数据绑定到同一 SQL 语句中的LONG和 lob 列。但是, 可以将超过4000个字节的数据绑定到LONG或 LOB 列。

此外, LONG列不能出现在 SQL 语句的这些部分中:

  • GROUPon 子句,ORDERBY子句, 或CONNECTBY子句或BY DISTINCT运算符在SELECT语句中

  • SELECT语句的UNIQUE运算符

  • CREATE CLUSTER语句的列列表

  • CREATEMATERIALIZEDVIEW语句的CLUSTER子句

  • SQL 内置函数、表达式或条件

  • SELECT包含GROUPBY查询列表子句

  • SELECTUNIONINTERSECTMINUS集运算符组合的子查询或查询列表

  • SELECTCREATETABLE的列表.。ASSELECT语句

  • ALTERTABLE..。MOVE语句

  • INSERT语句中的子查询中的SELECT列表

触发器可以按以下方式使用LONG数据类型:

  • 触发器中的 SQL 语句可以将数据插入到LONG列中。

  • 如果LONG列中的数据可以转换为受约束的数据类型 (如CHARVARCHAR2), 则可以在触发器内的 SQL 语句中引用LONG列。

  • 不能使用LONG数据类型声明触发器中的变量。

  • :NEW和:OLD不能与LONG列一起使用。

可以使用 Oracle 调用接口函数从数据库中检索LONG值的一部分。

日期时间和间隔数据类型

datetime 数据类型为DATETIMESTAMPTIMESTAMPWITHTIMEZONE, 以及TIMESTAMP, 并WITHLOCALTIMEZONE日期时间数据类型的值有时称为datetimes间隔数据类型为INTERVALYEAR TO MONTHINTERVALDAYTOSECOND间隔数据类型的值有时称为间隔有关将日期时间和间隔值表示为文本的信息, 请参阅"datetime 文本""间隔文本".

datetimes 和间隔都由字段组成。这些字段的值确定数据类型的值。表 3-4列出了日期时间字段及其 datetimes 和间隔的可能值。

为了避免对 datetime 数据的 DML 操作产生意外结果, 可以通过查询内置 SQL 函数DBTIMEZONESESSIONTIMEZONE来验证数据库和会话时区。如果尚未手动设置时区, 则 Oracle 数据库默认情况下使用操作系统时区。如果操作系统时区不是有效的 Oracle 时区, 则 oracle 将使用 UTC 作为默认值。

表3-4 日期时间字段和值

日期时间字段 日期时间的有效值 间隔的有效值

YEAR

-4712 到 9999 (不包括年 0)

任何正负整数

MONTH

01到12

0到11

DAY

01到 31 (根据当前 NLS 日历参数的规则, 受MONTHYEAR的值的限制)

任何正负整数

HOUR

00到23

0到23

MINUTE

00到59

0到59

SECOND

00到 59.9 (n), 其中 9 (n) 是时间小数秒的精度。9 (n) 部分不适用于DATE.

0到 59.9 (n), 其中 9 (n) 是间隔小数秒的精度

TIMEZONE_HOUR

-12 到 14 (此范围可容纳夏令时更改)。不适用于DATETIMESTAMP.

不适用

TIMEZONE_MINUTE

(请参阅表格末尾的备注)

00到59。不适用于DATETIMESTAMP.

不适用

TIMEZONE_REGION

查询V$TIMEZONE_NAMES数据字典视图的TZNAME列。不适用于DATETIMESTAMP有关所有时区区域名称的完整列表, 请参阅Oracle 数据库全球化支持指南.

不适用

TIMEZONE_ABBR

查询V$TIMEZONE_NAMES数据字典视图的TZABBREV列。不适用于DATETIMESTAMP.

不适用


注意:

TIMEZONE_HOURTIMEZONE_MINUTE是一起指定的, 并被解释为+格式中的一个实体 | - hh : mi, 其值从-12:59 到 + 14:00 不等。 有关为该 API 指定时区值的信息, 请参阅 . NET 开发者指南的 Oracle 数据提供程序 。

日期数据类型

DATE数据类型存储日期和时间信息。虽然日期和时间信息可以在字符和数字数据类型中表示, 但DATE数据类型具有特殊的关联属性。对于每个DATE值, Oracle 存储以下信息: 年、月、日、小时、分钟和秒。

可以将DATE值指定为文本, 也可以将字符或数字值转换为具有TO_DATE函数的日期值。有关以上述两种方式表示 DATE 值的示例, 请参阅 "日期DATE文本".

使用朱利安天

朱利安日数是自4712年1月1日公元前以来的天数。朱利安天允许连续的约会从一个共同的参考。可以使用 date 函数TO_DATETO_CHAR的日期格式模型 "J" 在 OracleDATE值和它们的朱利安等价项之间进行转换。

注意:

Oracle 数据库使用计算朱利安天的天文学系统, 年 4713 BC 指定作为-4712。 相反, 计算朱利安天的历史系统指定4713公元前4713。 如果您将 Oracle 朱利安天数与使用历史系统计算的值进行比较, 请注意允许在 BC 日期中进行365天的差异。 有关更多信息, 请参见http://aa.usno.navy.mil/faq/docs/millennium.php.

默认日期值按如下方式确定:

  • 年份是当前年份, 如SYSDATE日期所返回.

  • 月份是当前月份, 由SYSDATE日期返回.

  • 这一天是 01 (一个月的第一天)。

  • 小时、分钟和秒都是0。

这些默认值用于请求日期值没有指定日期的查询, 如下面的示例所示:

SELECT TO_DATE('2009', 'YYYY')
  FROM DUAL;

TO_DATE('
---------
01-MAY-09

例子此语句返回朱利安等效 2009年1月1日:

SELECT TO_CHAR(TO_DATE('01-01-2009', 'MM-DD-YYYY'),'J')
    FROM DUAL;

TO_CHAR
-------
2454833

时间戳数据类型

TIMESTAMP数据类型是DATE数据类型的扩展。它存储DATE数据类型的年、月和日, 加上小时、分钟和第二个值。此数据类型用于存储精确的时间值以及收集和评估跨地理区域的日期信息。指定TIMESTAMP数据类型, 如下所示:

TIMESTAMP [(fractional_seconds_precision)] 

其中fractional_seconds_precision可选地指定在SECONDdatetime 字段的小数部分中 Oracle 存储的位数。创建此数据类型的列时, 该值可以是范围0到9之间的数字。默认值为6。

带时区数据类型的时间戳

TIMESTAMPWITHTIMEZONE是时间TIMESTAMP的变体, 它包含时区区域名称时区偏移在其值中。时区偏移量是本地时间和 UTC (协调通用时间-以前格林尼治标准时间) 之间的差异 (以小时和分钟为间隔)。此数据类型对于保存本地时区信息非常有用。

指定TIMESTAMPTIMEZONE数据类型, 如WITH所示:

TIMESTAMP [(fractional_seconds_precision)] WITH TIME ZONE

其中fractional_seconds_precision可选地指定在SECONDdatetime 字段的小数部分中 Oracle 存储的位数。创建此数据类型的列时, 该值可以是范围0到9之间的数字。默认值为6。

Oracle 时区数据是从http://www.iana.org/time-zones/中可用的公共域信息派生的。Oracle 时区数据可能无法反映此站点上可用的最新数据。

具有本地时区数据类型的时间戳

TIMESTAMPWITHLOCALTIMEZONE是对时区信息敏感的TIMESTAMP的另一个变体。它与TIMESTAMPWITHTIMEZONE不同, 因为数据库中存储的数据被规范化到数据库时区, 并且时区信息不作为列数据的一部分存储。当用户检索数据时, Oracle 将在用户的本地会话时区中返回它。此数据类型对于始终显示在两层应用程序中客户端系统的时区中的日期信息非常有用。

指定TIMESTAMPLOCALTIMEZONE数据类型, 如WITH所示:

TIMESTAMP [(fractional_seconds_precision)] WITH LOCAL TIME ZONE

其中fractional_seconds_precision可选地指定在SECONDdatetime 字段的小数部分中 Oracle 存储的位数。创建此数据类型的列时, 该值可以是范围0到9之间的数字。默认值为6。

Oracle 时区数据是从http://www.iana.org/time-zones/上可用的公共域信息派生的。Oracle 时区数据可能无法反映此站点上可用的最新数据。

间隔年到月份数据类型

INTERVALYEARto TOMONTH使用YEARMONTHdatetime 字段存储一段时间。此数据类型对于表示两个 datetime 值之间的差异很有用, 因为只有年份和月份值是重要的。

指定INTERVALYEARTOMONTH, 如下所示:

INTERVAL YEAR [(year_precision)] TO MONTH

其中year_precisionYEARdatetime 字段中的位数。year_precision的默认值为2。

将间隔值指定为文本时, 您有很大的灵活性。有关将间隔值指定为文本的详细信息, 请参阅"间隔文本" 。还请参见"日期时间和间隔示例" , 以查看使用间隔的示例。

间隔日到第二个数据类型

INTERVALDAYto TOSECOND以天、小时、分钟和秒为单位存储一段时间。此数据类型用于表示两个 datetime 值之间的精确差异。

请按如下方式指定此数据类型:

INTERVAL DAY [(day_precision)] 
   TO SECOND [(fractional_seconds_precision)]

地方

  • day_precisionDAYdatetime 字段中的位数。接受值为0到9。默认值为2。

  • fractional_seconds_precisionSECONDdatetime 字段的小数部分中的位数。接受值为0到9。默认值为6。

将间隔值指定为文本时, 您有很大的灵活性。有关将间隔值指定为文本的详细信息, 请参阅"间隔文本" 。还请参见"日期时间和间隔示例" , 以了解使用间隔的示例。

日期时间/间隔算术

您可以TIMESTAMP在日期 (DATE)、时间戳 (TIMESTAMPTIMESTAMPWITHTIMEZONE) 中执行大量算术运算, 并WITHLOCAL TIMEZONE) 和时间间隔 (INTERVALDAYTOSECONDINTERVALYEARTOMONTH) 数据。Oracle 根据以下规则计算结果:

  • 可以在日期和时间戳值的算术运算中使用NUMBER常量, 但不能在间隔值上用到。Oracle 内部将时间戳值转换为日期值, 并将算术 datetime 和间隔表达式中的NUMBER常量解释为天数。例如,SYSDATE日期 + 1 是明天。SYSDATE日期-7 是一个星期前。SYSDATE日期 + (10/1440) 距现在十分钟。hire_date employees SYSDATE日期中减去示例表雇员的 hire_date 列将返回自雇用每个雇员以来的天数。不能相乘或分割日期或时间戳值。

  • Oracle 隐式地将BINARY_FLOATBINARY_DOUBLE操作数转换为NUMBER.

  • 每个DATE值都包含一个时间分量, 许多日期操作的结果包括一个分数。这一小部分意味着一天的一部分。例如, 1.5 天是36小时。这些分数也由 Oracle 内置函数为DATE数据上的常见操作返回。例如, MONTHS_BETWEEN函数返回两个日期之间的月份数。结果的小数部分表示31天月份的一部分。

  • 如果一个操作数是DATE值或数值 (其中两个值都不包含时区或小数秒组件), 则:

    • Oracle 将其他操作数隐式转换为DATE数据。异常是数值乘以一个区间的乘法, 它返回一个间隔。

    • 如果另一个操作数具有时区值, 则 Oracle 将在返回的值中使用会话时区。

    • 如果另一个操作数有小数秒值, 则会丢失小数秒值。

  • 将时间戳、间隔或数值传递给仅为DATE数据类型设计的内置函数时, Oracle 将非DATE值隐式转换为DATE值。有关哪些函数导致将隐式转换为DATE的信息, 请参阅"日期时间函数" 。.

  • 当间隔计算返回 datetime 值时, 结果必须是实际的日期时间值, 否则数据库将返回错误。例如, 下两个语句返回错误:

    SELECT TO_DATE('31-AUG-2004','DD-MON-YYYY') + TO_YMINTERVAL('0-1')
      FROM DUAL;
    
    SELECT TO_DATE('29-FEB-2004','DD-MON-YYYY') + TO_YMINTERVAL('1-0')
      FROM DUAL;
    

    第一次失败是因为在31天的月份中添加一个月将导致 9月31日, 这不是一个有效的日期。第二个失败, 因为将一年添加到仅存在每四年的日期无效。但是, 下一条语句成功, 因为将四年添加到2月29日日期是有效的:

    SELECT TO_DATE('29-FEB-2004', 'DD-MON-YYYY') + TO_YMINTERVAL('4-0')
      FROM DUAL;
     
    TO_DATE('
    ---------
    29-FEB-08
    
  • Oracle 在 UTC 时间内执行所有时间戳算法。对于TIMESTAMPWITHLOCALTIMEZONE, Oracle 将日期时间值从数据库时区转换为 UTC, 并在执行算术运算后将其转换回数据库时区。对于TIMESTAMPWITHTIMEZONE, datetime 值始终为 UTC, 因此不需要进行转换。

表 3-5是日期时间算术运算的矩阵。破折号表示不支持的操作。

表3-5 日期时间算术矩阵

操作数 & 运算符 日期 时间 戳 区间 数字

日期

       

+

DATE

DATE

-

NUMBER

INTERVAL

DATE

DATE

*

/

时间 戳

       

+

TIMESTAMP

DATE

-

INTERVAL

INTERVAL

TIMESTAMP

DATE

*

/

区间

       

+

DATE

TIMESTAMP

INTERVAL

-

INTERVAL

*

INTERVAL

/

INTERVAL

数字

       

+

DATE

DATE

NA

-

NA

*

INTERVAL

NA

/

NA


例子可以将间隔值表达式添加到开始时间。请考虑使用列order_date的示例表oe.orders 。以下语句将30天添加到order_date列的值:

SELECT order_id, order_date + INTERVAL '30' DAY AS "Due Date"
  FROM orders
  ORDER BY order_id, "Due Date";

支持夏时制时间

Oracle 数据库为任何给定时区区域自动确定夏时制是否有效, 并相应地返回本地时间值。日期时间值足以供 Oracle 在除边界用例以外的所有情况下确定给定区域的夏时制是否有效。在夏令时进入或无效的期间发生边界情况。例如, 在美国-太平洋地区, 当夏令时生效时, 时间从凌晨2:00 变到3:002和凌晨3点之间的一个小时间隔不存在。当夏令时熄灭时, 时间从凌晨2:00 恢复到凌晨1:00, 并且重复1和凌晨2点之间的一小时间隔。

为了解决这些边界情况, Oracle 使用TZRTZD格式元素, 如表 3-17中所述。TZR表示日期时间输入字符串中的时区区域名称。例如 "Australia/North"、"UTC" 和 "Singapore"。TZD表示具有夏时制信息的时区区域名称的缩写形式。示例为美国/太平洋标准时间的 "PST" 和 "PDT", 用于美国/太平洋夏令时。若要查看TZRTZD格式元素的有效值的列表, 请查询V$TIMEZONE_NAMES动态性能视图的TZNAMETZABBREV列。

注意:

时区区域名称由夏时制功能所需。 这些名称存储在两种类型的时区文件中: 一个是大的, 一个是小的。 这些文件之一是默认文件, 具体取决于您所使用的环境和 Oracle 数据库的发布。 有关时区文件和名称的详细信息, 请参阅 Oracle 数据库全球化支持指南.

有关两个文件中时区区域名称的完整列表, 请参阅 Oracle 数据库全球化支持指南.

Oracle 时区数据是从http://www.iana.org/time-zones/中可用的公共域信息派生的。Oracle 时区数据可能无法反映此站点上可用的最新数据。

日期时间和间隔示例

下面的示例演示如何指定某些日期时间和间隔数据类型。

CREATE TABLE time_table
  (start_time    TIMESTAMP,
   duration_1    INTERVAL DAY (6) TO SECOND (5),
   duration_2    INTERVAL YEAR TO MONTH);

start_time列的类型为TIMESTAMPTIMESTAMP的隐式小数秒精度为6。

duration_1列的类型为INTERVALDAYTOSECOND字段DAY中的最大位数为 6, 小数秒中的最大位数为5。所有其他日期时间字段中的最大位数为2。

duration_2列的类型为INTERVALYEARTOMONTH每个字段 (YEARMONTH) 中值的最大位数为2。

间隔数据类型没有格式模型。因此, 若要调整其演示文稿, 必须合并字符函数 (如EXTRACT) 并将组件串联起来。例如, 以下示例分别查询hr.employeesoe.orders表, 并将表单 "yymm" 窗体中的间隔输出更改为 "yymm月份", 并从 "dd-hh"to"ddddhh小时 ":

SELECT last_name, EXTRACT(YEAR FROM (SYSDATE - hire_date) YEAR TO MONTH)
       || ' years '
       || EXTRACT(MONTH FROM (SYSDATE - hire_date) YEAR TO MONTH)
       || ' months'  "Interval"
  FROM employees;

LAST_NAME                 Interval
------------------------- --------------------
OConnell                  2 years 3 months
Grant                     1 years 9 months
Whalen                    6 years 1 months
Hartstein                 5 years 8 months
Fay                       4 years 2 months
Mavris                    7 years 4 months
Baer                      7 years 4 months
Higgins                   7 years 4 months
Gietz                     7 years 4 months
. . .

SELECT order_id, EXTRACT(DAY FROM (SYSDATE - order_date) DAY TO SECOND)
       || ' days '
       || EXTRACT(HOUR FROM (SYSDATE - order_date) DAY TO SECOND)
       || ' hours' "Interval"
  FROM orders;

  ORDER_ID Interval
---------- --------------------
      2458 780 days 23 hours
      2397 685 days 22 hours
      2454 733 days 21 hours
      2354 447 days 20 hours
      2358 635 days 20 hours
      2381 508 days 18 hours
      2440 765 days 17 hours
      2357 1365 days 16 hours
      2394 602 days 15 hours
      2435 763 days 15 hours
. . .

原始和长期原始数据类型

RAWLONG RAW数据类型存储在不同系统之间移动数据时, Oracle 数据库不显式转换的数据。这些数据类型用于二进制数据或字节字符串。例如, 可以使用LONG RAW存储图形、声音、文档或二进制数据的数组, 解释依赖于使用。

Oracle 强烈建议将LONG RAW列转换为二进制 LOB (BLOB) 列。LOB 列的限制要比LONG列少得多。有关详细信息, 请参阅TO_LOB 。

RAW是一种可变长度的数据类型, 如VARCHAR2, 但 oracle Net (它将客户端软件连接到数据库或一个数据库), 并且 oracle 导入和导出实用程序不执行字符转换, 当传输RAWLONG RAW数据。相比之下, oracle Net 和 oracle 导入和导出实用程序会在不同的数据库字符集之间自动转换CHAR、 VARCHAR2LONG数据, 如果数据在数据库之间传输, 或者在数据库字符集和客户端字符集 (如果数据在数据库和客户端之间传输)。客户端字符集由客户端接口的类型 (如保监或 JDBC) 和客户端配置 (例如NLS_LANG环境变量) 确定。

当 Oracle 隐式地将RAWLONG RAW数据转换为字符数据时, 结果字符值包含二进制输入的十六进制表示形式, 其中每个字符都是十六进制数字 (0-9AF) 表示连续四位RAW数据。例如, 带有 bits 11001011 的RAW数据的一个字节成为值CB.

当 Oracle 将字符数据隐式转换为RAWLONG RAW时, 它会将每个连续输入字符解释为四个连续二进制数据位的十六进制表示形式, 并生成生成的RAWLONGRAW值, 通过串联这些位。如果任何输入字符不是十六进制数字 ( A0-9,Faf), 则报告错误。如果字符数为奇数, 则结果未定义。

SQL 函数RAWTOHEXHEXTORAW执行与上述隐式转换等效的显式转换。RAW和字符数据之间的其他转换类型可能与 Oracle 提供的 PL/SQL 包UTL_RAWUTL_I18N中的函数有关。.

大型对象 (LOB) 数据类型

内置 LOB 数据类型BLOB、 CLOBNCLOB (内部存储) 和BFILE (外部存储) 可以存储大型和非结构化数据, 如文本、图像、视频和空间数据。BLOB、 CLOBNCLOB数据的大小可以高达 (232-1 个字节) * (LOB 存储的CHUNK参数的值)。如果数据库中的表空间是标准块大小, 并且在创建 lob 列时使用了 lob 存储的CHUNK参数的默认值, 则这相当于 (232-1 字节) * (数据库块大小)。BFILE数据最多可达2个64-1 字节, 尽管您的操作系统可能对此最大值施加限制。

在创建表时, 可以选择为该表指定的 lob 列或 lob 对象属性指定不同的空间和存储特征。

如果在创建 LOB 列时在行中启用了存储, 则CLOB、 NCLOBBLOB值最多约为4000个字节。大于4000字节的 lob 始终存储在外部。有关详细信息, 请参阅在行中启用存储

lob 列包含可以引用内部 (在数据库中) 或外部 (数据库外) lob 值的 lob 定位器。从表中选择 lob 实际上返回 lob 定位器, 而不是整个 lob 值。在 lob 上的DBMS_LOB包和 Oracle 调用接口 (保监) 操作通过这些定位器执行。

lob 类似于LONGLONG RAW类型, 但以下列方式不同:

  • lob 可以是对象类型的属性 (用户定义的数据类型)。

  • lob 定位器存储在表列中, 无论是实际的 lob 值还是不存在。BLOB、 NCLOBCLOB值可以存储在单独的表空间中。BFILE数据存储在服务器上的外部文件中。

  • 当您访问 LOB 列时, 将返回定位器。

  • LOB 可达 (232-1 字节) * (数据库块大小) 的大小。BFILE数据最多可达2个64-1 字节, 尽管您的操作系统可能对此最大值施加限制。

  • lob 允许对数据进行高效、随机、分段的访问和操作。

  • 可以在表中定义多个 LOB 列。

  • NCLOB外, 还可以在对象中定义一个或多个 LOB 属性。

  • 可以声明 LOB 绑定变量。

  • 您可以选择 lob 列和 lob 属性。

  • 可以插入新行或更新包含一个或多个 lob 列或具有一个或多个 lob 属性的对象的现有行。在更新操作中, 可以将内部 LOB 值设置为NULL、空或用数据替换整个 LOB。可以将BFILE设置为NULL或使其指向其他文件。

  • 可以使用另一个 lob 行列交集或 lob 属性更新 lob 行列交集或 lob 属性。

  • 您可以删除包含 lob 列或 lob 属性的行, 从而也删除 lob 值。对于 BFILEs, 不会删除实际的操作系统文件。

通过发出INSERTUPDATE语句, 可以访问和填充内嵌 lob 列 (存储在数据库中的 lob 列) 或 lob 属性 (存储在数据库中的对象类型列的属性) 中的行。

对 LOB 列的限制 LOB 列受许多规则和限制的约束。有关完整列表, 请参见 Oracle 数据库 SecureFiles 和大型对象开发人员指南 。

BFILE 数据类型

BFILE数据类型允许访问存储在 Oracle 数据库之外的文件系统中的二进制文件 lob。BFILE列或属性存储BFILE定位器, 它用作指向服务器文件系统上的二进制文件的指针。定位器维护目录名和文件名。

您可以更改BFILE的文件名和路径, 而不会使用BFILENAME函数影响基表。有关此内置 SQL 函数的详细信息, 请参阅BFILENAME 。

二进制文件 lob 不参与事务, 无法恢复。相反, 底层操作系统提供文件完整性和耐久性。BFILE数据最多可达2个64-1 字节, 尽管您的操作系统可能对此最大值施加限制。

数据库管理员必须确保外部文件存在, 并且 Oracle 进程对该文件具有操作系统读取权限。

BFILE数据类型启用大二进制文件的只读支持。不能修改或复制此类文件。Oracle 提供了用于访问文件数据的 api。用于访问文件数据的主要接口是DBMS_LOB包和 Oracle 调用接口 (保监)。

BLOB 数据类型

BLOB数据类型存储非结构化的二进制大对象。BLOB对象可以被认为是没有字符集语义的位流。BLOB对象可以将二进制数据存储到 (4 gb-1) * (LOB 存储的CHUNK参数的值)。如果数据库中的表空间是标准块大小, 并且在创建 lob 列时使用了 lob 存储的CHUNK参数的默认值, 则这相当于 (4 gb-1) * (数据库块大小)。

BLOB对象具有完全事务性支持。通过 SQL、 DBMS_LOB包或 Oracle 调用接口 (保监) 进行的更改完全参与事务。可以提交和回滚BLOB值操作。但是, 不能将BLOB定位器保存在一个事务中的 PL/SQL 或保真变量中, 然后在另一个事务或会话中使用它。

CLOB 数据类型

CLOB数据类型存储单字节和多字节字符数据。支持固定宽度和可变宽度字符集, 同时使用数据库字符集。CLOB对象最多可存储字符数据的 (4 gb-1) * (LOB 存储的CHUNK参数的值)。如果数据库中的表空间是标准块大小, 并且在创建 lob 列时使用了 lob 存储的CHUNK参数的默认值, 则这相当于 (4 gb-1) * (数据库块大小)。

CLOB对象具有完全事务性支持。通过 SQL、 DBMS_LOB包或 Oracle 调用接口 (保监) 进行的更改完全参与事务。可以提交和回滚CLOB值操作。但是, 不能将CLOB定位器保存在一个事务中的 PL/SQL 或保真变量中, 然后在另一个事务或会话中使用它。

NCLOB 数据类型

NCLOB数据类型存储 Unicode 数据。支持固定宽度和可变宽度字符集, 同时使用国家字符集。NCLOB对象最多可以存储字符文本数据的 (4 gb-1) * (LOB 存储的CHUNK参数的值)。如果数据库中的表空间是标准块大小, 并且在创建 lob 列时使用了 lob 存储的CHUNK参数的默认值, 则这相当于 (4 gb-1) * (数据库块大小)。

NCLOB对象具有完全事务性支持。通过 SQL、 DBMS_LOB包或保监处进行的更改完全参与事务。可以提交和回滚NCLOB值操作。但是, 不能将NCLOB定位器保存在一个事务中的 PL/SQL 或保真变量中, 然后在另一个事务或会话中使用它。

Rowid 数据类型

数据库中的每一行都有一个地址。下面的部分描述了 Oracle 数据库中的两种形式的行地址。

ROWID 数据类型

位于 Oracle 数据库本机的堆组织表中的行具有名为rowids的行地址。您可以通过查询 pseudocolumn ROWID来检查 rowid 行地址。此 pseudocolumn 的值是表示每一行的地址的字符串。这些字符串具有数据类型ROWID还可以创建包含ROWID数据类型的实际列的表和群集。Oracle 数据库不保证此类列的值是有效的 rowids。有关ROWID pseudocolumn 的详细信息, 请参阅2 章 "Pseudocolumns" 。

注意:

从 Oracle8 开始, Oracle SQL 为 rowids 提供了一种扩展格式, 以有效支持分区表和索引以及表空间相对数据块地址, 而不会产生歧义。 如果正在运行数据库的版本7并且打算升级, 请使用DBMS_ROWID包将数据中的 rowids 迁移到扩展格式。 有关 DBMS_ROWID 和 Oracle 数据库升级指南的信息, 请参阅Oracle 数据库 PL/SQL 包和类型参考, 以了解有关从 Oracle7 升级的信息。

Rowids 包含以下信息:

  • 包含行的数据文件的数据块此字符串的长度取决于您的操作系统。

  • 数据块中的

  • 包含行的数据库文件第一个数据文件有数字1。此字符串的长度取决于您的操作系统。

  • 数据对象编号, 它是分配给每个数据库段的标识号。可以从数据字典视图USER_OBJECTS、 DBA_OBJECTSALL_OBJECTS检索数据对象编号。共享同一段的对象 (例如, 同一个群集中的聚集表) 具有相同的对象号。

Rowids 存储为基64值, 可以包含字符 a-z、a-z、0-9 和加号 (+) 和正斜杠 (/)。Rowids 不能直接使用。可以使用提供的包DBMS_ROWID来解释 ROWID 内容。包函数提取并提供上面列出的四 rowid 元素的信息。

UROWID 数据类型

某些表的行具有非物理或永久性的地址, 或者不是由 Oracle 数据库生成的。例如, 索引组织表的行地址存储在索引叶中, 可以移动。外部表的 Rowids (例如通过网关访问的 DB2 表) 不是标准的 Oracle Rowids。

Oracle 使用通用 rowids (urowids) 来存储索引组织和外部表的地址。索引组织表具有逻辑 urowids, 外部表具有外部 urowids。这两种类型的 urowid 都存储在ROWID pseudocolumn 中 (与堆组织的表的物理 rowids 一样)。

Oracle 基于表的主键创建逻辑 rowids。只要主键不更改, 逻辑 rowids 就不会更改。索引组织表的ROWID pseudocolumn 具有UROWID的数据类型。您可以访问此 pseudocolumn, 就像对堆组织的表的ROWID pseudocolumn (使用SELECT一样)..。ROWID语句)。如果希望存储索引组织表的 rowids, 则可以为该表定义一个类型为to UROWID的列, 并将ROWID pseudocolumn 的值检索到该列中。

ANSI、DB2 和 SQL/DS 数据类型

创建表和群集的 SQL 语句还可以使用来自 IBM 产品 SQL/DS 和 DB2 的 ANSI 数据类型和数据类型。oracle 识别与 Oracle 数据库数据类型名称不同的 ANSI 或 IBM 数据类型名称。它将数据类型转换为等效的 oracle 数据类型, 将 Oracle 数据类型记录为列数据类型的名称, 并根据随后的表中显示的转换将列数据存储在 Oracle 数据类型中。

表3-6 转换为 Oracle 数据类型的 ANSI 数据类型

ANSI SQL 数据类型 Oracle 数据类型

CHARACTER(n)

CHAR(n)

CHAR(n)

CHARACTER VARYING(n)

CHAR VARYING(n)

VARCHAR2(n)

NATIONAL CHARACTER(n)

NATIONAL CHAR(n)

NCHAR(n)

NCHAR(n)

NATIONAL CHARACTER VARYING(n)

NATIONAL CHAR VARYING(n)

NCHAR VARYING(n)

NVARCHAR2(n)

NUMERIC[(p,s)]

DECIMAL[(p,s)](附注 1)

NUMBER(p,s)

INTEGER

INT

SMALLINT

NUMBER(p,0)

FLOAT(附注 2)

DOUBLE PRECISION(附注 3)

REAL(附注 4)

FLOAT(126)

FLOAT(126)

FLOAT(63)


笔记:

  1. NUMERICDECIMAL数据类型只能指定定点数字。对于这些数据类型, 比例 (s) 默认为0。

  2. FLOAT数据类型是具有二进制精度 b 的浮点数字。此数据类型的默认精度为126个二进制, 或38个十进制。

  3. DOUBLE PRECISION数据类型是具有二进制精度126的浮点数字。

  4. REAL数据类型是一个浮点数字, 其二进制精度为63或18十进制。

使用以下 SQL/DS 和 DB2 数据类型, 请执行, 因为它们没有相应的 Oracle 数据类型:

  • GRAPHIC

  • LONGVARGRAPHIC

  • VARGRAPHIC

  • TIME

请注意,TIME类型的数据也可以表示为 Oracle datetime 数据。

表3-7 转换为 Oracle 数据类型的 SQL/DS 和 DB2 数据类型

SQL/DS 或 DB2 数据类型 Oracle 数据类型

CHARACTER(n)

CHAR(n)

VARCHAR(n)

VARCHAR(n)

LONG VARCHAR

LONG

DECIMAL(p,s)(附注 1)

NUMBER(p,s)

INTEGER

SMALLINT

NUMBER(p,0)

FLOAT(附注 2)

NUMBER


笔记:

  1. DECIMAL数据类型只能指定定点数字。对于此数据类型, s默认为0。

  2. FLOAT数据类型是具有二进制精度b的浮点数字。此数据类型的默认精度为126个二进制或38十进制。

用户定义类型

用户定义的数据类型使用 Oracle 内置的数据类型和其他用户定义的数据类型作为对象类型的构造块, 用于对应用程序中数据的结构和行为建模。下面的部分描述了不同类别的用户定义类型。

对象类型

对象类型是应用程序处理的实体 (如采购订单) 的抽象。对象类型是具有三种组件的架构对象:

  • 一个 name, 该名称标识该架构中唯一的对象类型。

  • 属性, 它们是内置类型或其他用户定义类型。属性模型是真实世界实体的结构。

  • 方法, 它们是用 PL/SQL 编写并存储在数据库中的函数或过程, 或者用 C 或 Java 之类的语言编写, 并在外部存储。方法实现应用程序可以在实际实体上执行的操作。

REF 数据类型

对象标识符(由关键字OID表示) 唯一标识对象, 使您可以从其他对象或关系表引用对象。称为REF的数据类型类别表示此类引用。REF数据类型是对象标识符的容器。REF值是指向对象的指针。

REF值指向不存在的对象时, REF被认为是 "悬空" 的。悬空REF与 null REF不同。要确定REF是否挂起, 请使用条件IS[NOT]DANGLING例如, 给定的对象视图oc_orders在示例架构oe中, 列customer_ref的类型REF类型customer_typ, 它具有一个属性cust_email:

SELECT o.customer_ref.cust_email
  FROM oc_orders o 
  WHERE o.customer_ref IS NOT DANGLING;

Varrays

数组是一组有序的数据元素。给定数组的所有元素都具有相同的数据类型。每个元素都有一个index, 它是一个与数组中元素的位置相对应的数字。

数组中的元素数是数组的大小。Oracle 数组的大小是可变的, 这就是它们被称为varrays的原因。声明 varray 时, 必须指定最大大小。

声明 varray 时, 它不会分配空间。它定义了一种类型, 您可以将其用作:

  • 关系表的列的数据类型

  • 对象类型属性

  • PL/SQL 变量、参数或函数返回类型

Oracle 通常以行 (作为行数据的一部分) 或超出行 (在 LOB 中) 存储数组对象, 具体取决于它的大小。但是, 如果为 varray 指定了单独的存储特性, 则 Oracle 将其存储在离线中, 而不管其大小。有关 varray 存储的详细信息, 请参阅创建表 varray_col_properties 

嵌套表

嵌套表类型为一组无序的元素建模。这些元素可以是内置类型或用户定义类型。可以将嵌套表作为单列表查看, 或者, 如果嵌套表是对象类型 (作为多列表), 则使用对象类型的每个属性的列。

嵌套表定义不分配空间。它定义了一种类型, 可用于声明:

  • 关系表的列的数据类型

  • 对象类型属性

  • PL/SQL 变量、参数或函数返回类型

当嵌套表作为关系表中的列的类型或对象表的基础对象类型的属性显示时, Oracle 将所有嵌套表数据存储在单个表中, 与封闭关系或对象表关联。

Oracle 提供的类型

当内置或 ANSI 支持的类型不足时, Oracle 提供了用于定义新类型的基于 SQL 的接口。这些类型的行为可以在 c/c++、Java 或 PL/SQL 中实现。Oracle 数据库自动提供用于输入输出、异构客户端访问新数据类型所需的低级基础结构服务, 以及应用程序和数据库之间数据传输的优化。

这些接口可用于生成用户定义的 (或对象) 类型, 并且 Oracle 也可以使用它们创建一些常用的数据类型。有几个这样的数据类型与服务器一起提供, 它们同时服务于广泛的水平应用程序区域 (例如,Any类型) 和特定的垂直部分 (例如, 空间类型)。

以下各节将介绍 Oracle 提供的类型以及对其实现和使用的文档的交叉引用:

  • 任何类型

  • XML 类型

  • 空间类型

  • 媒体类型

任何类型

Any类型提供了对实际类型未知的过程参数和表列的高度灵活的建模。这些数据类型使您可以动态地封装和访问任何其他 SQL 类型的类型说明、数据实例和数据实例集。这些类型有保监和 PL/SQL 接口, 用于构造和访问。

ANYTYPE

此类型可以包含任何命名的 SQL 类型或未命名的瞬态类型的类型说明。

ANYDATA

此类型包含给定类型的实例、数据以及类型的说明。ANYDATA可以用作表列数据类型, 并允许您在单个列中存储异类值。这些值可以是 SQL 内置类型以及用户定义的类型。

ANYDATASET

此类型包含给定类型的说明以及该类型的一组数据实例。ANYDATASET可用作过程参数数据类型, 需要这种灵活性。数据实例的值可以是 SQL 内置类型以及用户定义的类型。

XML 类型

可扩展标记语言 (XML) 是万维网联盟 (W3C) 为在万维网上表示结构化和非结构化数据而开发的标准格式。通用资源标识符 (uri) 标识 web 上任何位置的资源 (如 web 页)。Oracle 提供了处理 XML 和 URI 数据的类型, 以及称为DBURIRef类型的 uri 类来访问存储在数据库中的数据。它还提供了一组类型, 用于存储和访问数据库内的外部和内部 uri。

XMLType

此 Oracle 提供的类型可用于存储和查询数据库中的 XML 数据。XMLType具有可用于使用 XPath 表达式访问、提取和查询 XML 数据的成员函数。XPath 是 W3C 委员会开发的另一个用于遍历 XML 文档的标准。Oracle XMLType函数支持许多 W3C XPath 表达式。Oracle 还提供了一组 SQL 函数和 PL/SQL 程序包, 用于从现有关系或对象关系数据创建XMLType值。

XMLType是系统定义的类型, 因此可以将其用作函数的参数, 或作为表或视图列的数据类型。还可以创建XMLType的表和视图。在表中创建XMLType列时, 可以选择将 XML 数据存储在CLOB列中, 作为二进制 XML (作为CLOB存储在内部) 或对象人际关系。

还可以注册架构 (使用DBMS_XMLSCHEMA包), 并创建符合已注册架构的表或列。在这种情况下, Oracle 默认情况下将 XML 数据存储在基础对象关系列中, 但即使是基于架构的数据, 也可以在CLOB或二进制 XML 列中指定存储。

无论存储机制如何, XMLType列上的查询和 DML 操作都是相同的。

URI 数据类型

Oracle 提供了一个 URI 类型的系列-URIType、 DBURIType、 XDBURITypeHTTPURIType-这与继承层次结构相关。URIType是一个对象类型, 其他是URIType的子类。由于URIType是超类型, 因此可以创建此类型的列, 并在此列中存储DBURITypeHTTPURIType类型实例。

HTTPURIType可以使用HTTPURIType将 url 存储到外部网页或文件中。Oracle 使用 HTTP (超文本传输协议) 访问这些文件。

XDBURIType可以使用XDBURIType将 XML 数据库层次结构中的文档公开为可嵌入到表中任何URIType列中的 uri。XDBURIType由 URL 组成, 它包括它所引用的 XML 文档的层次结构名称和表示 XPath 语法的可选片段。片段用磅符号 (#) 与 URL 部分隔开。下面的行是XDBURIType的示例:

/home/oe/doc1.xml
/home/oe/doc1.xml#/orders/order_item

DBURITypeDBURIType可用于存储DBURIRef值, 该数值引用数据库内的数据。通过存储DBURIRef值, 可以引用存储在数据库内或外部的数据, 并可以一致地访问数据。

DBURIRef值使用类似于 XPath 的表示形式来引用数据库内的数据。如果将数据库想象为 xml 树, 则会将表、行和列视作 xml 文档中的元素。例如, 示例人力资源用户hr将看到以下 XML 树:

<HR> 
  <EMPLOYEES> 
    <ROW> 
      <EMPLOYEE_ID>205</EMPLOYEE_ID> 
      <LAST_NAME>Higgins</LAST_NAME> 
      <SALARY>12008</SALARY> 
      .. <!-- other columns --> 
    </ROW> 
    ... <!-- other rows --> 
  </EMPLOYEES> 
  <!-- other tables..--> 
</HR> 
<!-- other user schemas on which you have some privilege on..--> 

DBURIRef是此虚拟 XML 文档的 XPath 表达式。因此, 若要在员工编号为205的雇员的EMPLOYEES表中引用SALARY值, 可以编写DBURIRef ,

/HR/EMPLOYEES/ROW[EMPLOYEE_ID=205]/SALARY 

使用此模型, 您可以引用存储在CLOB列或其他列中的数据, 并将它们作为 url 公开给外部世界。

URIFactory 包装

Oracle 还提供URIFactory包, 它可以创建和返回URITypes的各种子类型的实例。该包分析 url 字符串, 标识 url 的类型 (HTTP、 DBURI等), 并创建子类型的实例。若要创建DBURI实例, URL 必须以前缀/oradb开头。例如, URIFactory.getURI('/oradb/HR/EMPLOYEES')将创建一个DBURIType实例和URIFactory.getUri('/sys/schema')将创建一个XDBURIType实例。

空间类型

Oracle 空间旨在使空间数据管理更容易和更自然地对用户的位置启用的应用程序, 地理信息系统 (GIS) 应用程序, 和 geoimaging 应用程序。在 Oracle 数据库中存储空间数据之后, 您可以轻松地操作、检索并将其与数据库中存储的所有其他数据关联起来。只有在安装了 Oracle 空间后, 下列数据类型才可用。

SDO_GEOMETRY

空间对象的几何描述存储在一行中, 位于用户定义表中的对象类型SDO_GEOMETRY的单个列中。任何具有SDO_GEOMETRY类型的列的表都必须有另一个列, 或一组列, 用于定义该表的唯一主键。此类表有时称为几何表。

SDO_GEOMETRY对象类型具有以下定义:

CREATE TYPE SDO_GEOMETRY AS OBJECT
  (sgo_gtype        NUMBER, 
   sdo_srid         NUMBER,
   sdo_point        SDO_POINT_TYPE,
   sdo_elem_info    SDO_ELEM_INFO_ARRAY,
   sdo_ordinates    SDO_ORDINATE_ARRAY);
/

SDO_TOPO_GEOMETRY

此类型描述一个拓扑几何, 它存储在一行中, 位于用户定义表中的对象类型SDO_TOPO_GEOMETRY的单个列中。

SDO_TOPO_GEOMETRY对象类型具有以下定义:

CREATE TYPE SDO_TOPO_GEOMETRY AS OBJECT
  (tg_type        NUMBER, 
   tg_id          NUMBER,
   tg_layer_id    NUMBER,
   topology_id    NUMBER);
/

SDO_GEORASTER

在 GeoRaster 对象关系模型中, 光栅网格或图像对象存储在一行中, 位于用户定义表中的对象类型SDO_GEORASTER的单个列中。此类表称为 GeoRaster 表。

SDO_GEORASTER对象类型具有以下定义:

CREATE TYPE SDO_GEORASTER AS OBJECT
  (rasterType         NUMBER,
   spatialExtent      SDO_GEOMETRY,
   rasterDataTable    VARCHAR2(32),
   rasterID           NUMBER,
   metadata           XMLType);
/

媒体类型

Oracle 多媒体使用类似于 Java 或 c++ 类的对象类型来描述多媒体数据。这些对象类型的实例由属性 (包括元数据和媒体数据) 和方法组成。多媒体数据类型是在ORDSYS架构中创建的。所有数据类型都存在公共同义词, 因此您可以在不指定架构名称的情况下访问它们。

Oracle 多媒体提供以下对象类型:

  • ORDAudio

    支持音频数据的存储和管理。

  • ORDDicom

    支持医学数字成像和通信 (DICOM) 的存储和管理, 这种格式被普遍认为是医学成像的标准。

  • ORDDoc

    支持存储和管理任何类型的媒体数据, 包括音频、图像和视频数据。如果希望将所有媒体存储在一列中, 请使用此类型。

  • ORDImage

    支持图像数据的存储和管理。

  • ORDVideo

    支持视频数据的存储和管理。

  • ORDImageSignature

    ORDImageSignature对象类型已弃用, 不应再引入到代码中。此对象类型的现有实例将继续与过去一样运行。

以下数据类型提供符合 ISO IEC 13249-5 静止图像标准 (通常称为 SQL/MM StillImage):

  • SI_AverageColor

    表示图像的平均颜色特征。

  • SI_Color

    封装颜色值。

  • SI_ColorHistogram

    表示一个特征, 该特性由原始图像的样本所显示的颜色的相对频率来表征图像。

  • SI_FeatureList

    一个列表, 其中包含由前面的对象类型 (SI_AverageColor、 SI_ColorHistogram、 SI_PositionalColorSI_Texture) 表示的图像特征的四, 其中每个功能都与功能权重。

  • SI_PositionalColor

    给定由m矩形划分为n的图像, SI_PositionalColor对象类型表示由nm和矩形的最重要颜色构成的图像的特征。

  • SI_StillImage

    表示具有固有图像特征 (如高度、宽度和格式) 的数字图像。

  • SI_Texture

    表示一个特征, 该特性由重复项 (粗)、亮度变化 (对比度) 和主要方向 (方向性) 的大小来刻画图像。

表达式筛选器类型

Oracle 表达式筛选器允许应用程序开发人员管理和评估描述用户在数据中的兴趣的条件表达式。表达式筛选器包括以下数据类型:

表达

表达式筛选器使用名为Expression的虚拟数据类型来管理和评估条件表达式作为数据库表中的数据。表达式筛选器通过向列分配属性集, 从VARCHAR2列创建Expression数据类型的列。此赋值允许数据约束确保列中存储的表达式的有效性。

可以使用Expression数据类型上的 "EVALUATE" 运算符定义条件, 以计算某些数据在列中存储的表达式。如果使用的是企业版, 则还可以在Expression数据类型的列上定义表达式筛选器索引, 以便使用EVALUATE运算符处理查询。


猜你喜欢

转载自blog.csdn.net/huyingzuo/article/details/80299615