ORACLE官方SQL语言参考笔记之Oracle SQL的基本元素篇(第三章-第四节-格式模型)

本文简述

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

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

英文名:《SQL Language Reference》

作者:二次猿

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

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

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


格式模型

格式模型是描述在字符串中存储的日期时间或数字数据格式的字符文本。格式模型不会更改数据库中值的内部表示形式。将字符串转换为日期或数字时, 格式模型确定 Oracle 数据库如何解释字符串。在 SQL 语句中, 可以将格式模型用作TO_CHARTO_DATE函数的参数, 以指定:

  • 用于从数据库中返回值的 Oracle 的格式

  • 为要在数据库中存储的 Oracle 指定的值的格式

例如:

  • 字符串 "17:45:29" 的 datetime 格式模型为 "HH24:MI:SS "'.

  • 字符串 "11-Nov-1999" 的 datetime 格式模型为 "DD-Mon-YYYY"'.

  • 字符串 "$2,304.25" 的数字格式模型为 "$9,999.99 "'.

有关数字和 datetime 格式模型元素的列表, 请参见表3-13、"数字格式元素"表 3-15 "datetime 格式元素".

某些格式的值由初始化参数的值确定。对于这些格式, 可以使用初始化参数NLS_TERRITORY来指定由这些格式元素返回的字符。您可以使用ALTERSESSION语句更改会话的默认日期格式。

另请参见:

  • 更改会话有关更改这些参数的值和格式模型示例的信息, 例如使用格式模型的示例

  • TO_CHAR (datetime)、 TO_CHAR (数字)TO_DATE

  • Oracle 数据库引用和 Oracle 数据库全球化支持指南有关这些参数的信息

本节的其余部分介绍如何使用以下格式模型:

  • 数字格式模型

  • Datetime 格式模型

  • 格式化模型修饰符

数字格式模型

可以在以下函数中使用数字格式模型:

  • TO_CHAR函数中, 将NUMBER、 BINARY_FLOATBINARY_DOUBLE数据类型的值转换为VARCHAR2数据类型

  • TO_NUMBER函数中, 将CHARVARCHAR2数据类型的值转换为NUMBER数据类型

  • TO_BINARY_FLOATTO_BINARY_DOUBLE函数中, 将CHARVARCHAR2表达式转换为BINARY_FLOATBINARY_DOUBLE

所有数字格式模型都会导致数字四舍五入为指定数量的有效位数。如果一个值的小数点左边的数字比格式指定的要多, 则磅符号 (#) 将替换该值。当您使用带有限制性数字格式字符串的TO_CHAR时, 通常会发生此事件, 从而导致舍入操作。

  • 如果正数NUMBER值非常大且不能以指定格式表示, 则无穷符号 (~) 将替换该值。同样, 如果负数NUMBER值非常小且不能用指定的格式表示, 则负无穷大符号将替换值 (-~)。

  • 如果BINARY_FLOATBINARY_DOUBLE值转换为CHARNCHAR, 并且输入是无穷大或NaN (不是数字), 则 Oracle 始终返回磅符号以替换该值。但是, 如果省略格式模型, 则 Oracle 将以字符串形式返回InfNan 。

数字格式元素

数字格式模型由一个或多个数字格式元素组成。下面的表列出了数字格式模型的元素, 并提供了一些示例。

负返回值自动包含前导负数, 并且正值自动包含前导空格, 除非格式模型包含MI、 SPR格式元素。

表3-13 数字格式元素

元素 例子 描述

(逗号)

9,999

返回指定位置的逗号。可以在数字格式模型中指定多个逗号。

限制:

  • 逗号元素无法开始数字格式模型。

  • 在数字格式模型中, 逗号不能显示在十进制字符或句点的右侧。

.期间)

99.99

返回一个小数点, 该点是指定位置中的句点 (.)。

限制:只能在数字格式模型中指定一个句点。

$

$9999

返回具有前导美元符号的值。

0

0999

9990

返回前导零。

返回尾随零。

9

9999

返回具有指定位数的值 (如果为正数) 或前导空格 (如果为负值)。前导零是空的, 除了零值外, 它为定点数字的整数部分返回零。

B

B9999

当整数部分为零 (无论格式模型中的零) 时, 返回定点数字的整数部分的空白。

C

C999

在指定位置返回 ISO 货币符号 ( NLS_ISO_CURRENCY参数的当前值)。

D

99D99

在指定位置返回十进制字符 (即NLS_NUMERIC_CHARACTER参数的当前值)。默认值为句点 (.)。

限制:在数字格式模型中只能指定一个十进制字符。

倍 e 码

9.9EEEE

返回使用科学表示法的值。

G

9G999

在指定位置返回组分隔符 ( NLS_NUMERIC_CHARACTER参数的当前值)。可以在数字格式模型中指定多个组分隔符。

限制:组分隔符不能显示在数字格式模型中十进制字符或句点的右侧。

L999

在指定位置返回本地货币符号 ( NLS_CURRENCY参数的当前值)。

9999MI

返回带有尾随减号 (-) 的负值。

返回具有尾随空白的正值。

限制:MI 格式元素只能出现在数字格式模型的最后一个位置。

公关

9999PR

返回 < 尖括号 > 中的负值。

返回具有前导和尾随空白的正值。

限制:PR 格式元素只能出现在数字格式模型的最后一个位置。

Rn

Rn

RN

rn

以大写形式返回罗马数字的值。

以小写形式返回罗马数字的值。

值可以是介于1和3999之间的整数。

S

S9999

9999S

返回带有前导减号 (-) 的负值。

返回具有前导加号 (+) 的正值。

返回带有尾随减号 (-) 的负值。

返回具有尾随加号 (+) 的正值。

限制:S 格式元素只能出现在数字格式模型的第一个或最后一个位置。

Tm

TM

文本最小数字格式模型返回 (在十进制输出中) 可能的最小字符数。此元素不区分大小写。

默认值为 TM9, 它以固定的表示法返回数字, 除非输出超过64个字符。如果输出超过64个字符, 则 Oracle 数据库将自动以科学记数法返回数字。

限制:

  • 不能将此元素置于任何其他元素的前面。

  • 您只能使用一个9或一个 e (或 e), 但不能使用这些元素的任何组合。下面的语句返回一个错误:

    SELECT TO_CHAR(1234, 'TM9e') FROM DUAL;

美国

U9999

在指定位置返回欧元 (或其他) 双币种符号, 由NLS_DUAL_CURRENCY参数的当前值确定。

V

999V99

返回一个值乘以10n(如果需要, 将其舍入), 其中nV之后的9的数字。.

X

XXXX

xxxx

返回指定数字的十六进制值。如果指定的数字不是整数, 则 Oracle 数据库将其舍入为整数。

限制:

  • 此元素只接受正值或0。负值返回错误。

  • 只能在该元素前面加上 0 (返回前导零) 或 FM。任何其他元素都将返回错误。如果您不指定0或 FM 与 X, 则返回总是有一个前导空白。有关详细信息, 请参阅格式模型修饰符FM 。


表 3-14显示了以下查询的结果: number'fmt'的不同值:

SELECT TO_CHAR(number, 'fmt')
  FROM DUAL;

表3-14 数字转换的结果

数量 fmt' 结果

-1234567890

9999999999S

'1234567890-'

0

99.99

' .00'

+0.1

99.99

' .10'

-0.2

99.99

' -.20'

0

90.99

' 0.00'

+0.1

90.99

' 0.10'

-0.2

90.99

' -0.20'

0

9999

' 0'

1

9999

' 1'

0

B9999

' '

1

B9999

' 1'

0

B90.99

' '

+123.456

999.999

' 123.456'

-123.456

999.999

'-123.456'

+123.456

FM999.009

'123.456'

+123.456

9.9EEEE

' 1.2E+02'

+1E+123

9.9EEEE

' 1.0E+123'

+123.456

FM9.9EEEE

'1.2E+02'

+123.45

FM999.009

'123.45'

+123.0

FM999.009

'123.00'

+123.45

L999.99

' $123.45'

+123.45

FML999.99

'$123.45'

+1234567890

9999999999S

'1234567890+'


日期时间格式模型

可以在以下函数中使用 datetime 格式模型:

  • TO_* datetime 函数中, 将以默认格式以外的格式转换为日期时间值的字符值。TO_* datetime 函数是TO_DATE、 TO_TIMESTAMPTO_TIMESTAMP_TZ.)

  • TO_CHAR函数中, 将 datetime 值转换为非默认格式的字符值 (例如, 从应用程序打印日期)

datetime 格式模型的总长度不能超过22个字符。

默认的 datetime 格式是用 nls 会话参数NLS_DATE_FORMAT、 NLS_TIMESTAMP_FORMATNLS_TIMESTAMP_TZ_FORMAT显式指定的, 或者隐式地使用 nls 会话参数NLS_TERRITORY您可以使用ALTER SESSION语句更改会话的默认日期时间格式。

日期时间格式元素

datetime 格式模型由一个或多个日期时间格式元素组成, 如表 3-15 "datetime 格式元素"中所列。.

  • 对于输入格式模型, 格式项不能显示两次, 并且无法组合表示类似信息的项。例如, 不能在同一格式字符串中使用 "SYYYY" 和 "BC"。

  • 第二列指示是否可以在TO_* datetime 函数中使用 format 元素。所有格式元素都可以在TO_CHAR函数中使用。

  • 下面的 datetime 格式元素可以在时间戳和间隔格式模型中使用, 但不在原始DATE格式模型中: FF、 TZD、 TZH, TZMTZR.

  • 许多 datetime 格式元素用空格或前导零填充到特定长度。有关详细信息, 请参阅格式模型修饰符FM 。

注意:

Oracle 建议您使用4位数的年份元素 ("YYYY"), 而不是基于这些较短年份元素
  • 4位数的年份元素消除了歧义。

  • 较短的年份元素可能会影响查询优化, 因为在查询编译时不知道年份, 只能在运行时确定。

日期格式元素中的大写字母

拼写出的单词、缩写或罗马数字中的大写跟随相应格式元素的大写。例如, 日期格式模型 ' 天 ' 产生大写的词, 如 ' 星期一 ';' 日 ' 生产 ' 星期一 ';"日" 生产 ' 星期一 '。

日期时间格式模型中的标点符号和字符文本

可以在日期格式模型中包含这些字符:

  • 标点符号, 如连字符、斜线、逗号、句点和冒号

  • 字符文本, 括在双引号中

这些字符在返回值中显示在格式模型中的相同位置。

表3-15 日期时间格式元素

元素 TO_ * 日期时间函数? 描述
-
/
,
.
;
:
"text"

是的

标点符号和带引号的文本在结果中重现。

AD
A.D.

是的

具有或不带句点的 AD 指示器。

AM
A.M.

是的

带或无句点的子午线指示器。

BC
B.C.

是的

具有或不带句点的 BC 指示器。

CC
SCC
 

世纪。

  • 如果4位数年份的最后2位数介于01和99之间 (包含), 则本世纪比该年的前2位数大一个。

  • 如果4位数年份的最后2位数为 00, 则该世纪与该年的前2位数字相同。

例如, 2002 返回 21;2000返回20。

D

是的

星期的天 (1-7)。此元素取决于会话的 NLS 区域。

DAY

是的

天的名称。

DD

是的

月的天 (1-31)。

DDD

是的

一年中的某一天 (1-366)。

DL

是的

以长日期格式返回一个值, 它是 Oracle 数据库DATE格式的扩展, 由NLS_DATE_FORMAT参数的当前值确定。使日期组件 (日名称、月数等等) 的外观取决于NLS_TERRITORYNLS_LANGUAGE参数。例如, 在AMERICAN_AMERICA区域设置中, 这相当于指定格式'fmDay, yyyy'Month dd, 。GERMAN_GERMANY区域设置中, 它等效于指定格式 "fmDay, dd.Month yyyy'.

限制:只能用空白分隔的TS元素指定此格式。

DS

是的

以短日期格式返回值。使日期组件 (日名称、月数等等) 的外观取决于NLS_TERRITORYNLS_LANGUAGE参数。例如, 在AMERICAN_AMERICA区域设置中, 这相当于指定格式 "MM/DD/RRRR哄"。ENGLISH_UNITED_KINGDOM区域设置中, 它等效于指定格式 "DD/MM/RRRR'.

限制:只能用空白分隔的TS元素指定此格式。

DY

是的

缩写的日期名称。

E

是的

缩写时代名称 (日本帝国, 中华民国官方, 泰国佛历)。

EE

是的

全时代名称 (日本帝国, 中华民国官方, 泰国佛历)。

FF [1..9]

是的

分数秒;不打印基数字符。使用 X 格式元素添加基数字符。在 FF 之后使用数字1到9指定返回的日期时间值的小数第二部分中的位数。如果未指定数字, 则 Oracle 数据库将使用为 datetime 数据类型或数据类型的默认精度指定的精度。在时间戳和间隔格式中有效, 但不能在DATE格式中生效。

示例:'HH:MI:SS.FF'

SELECT TO_CHAR(SYSTIMESTAMP, 'SS.FF3') from DUAL;

FM

是的

返回不带前导或尾随空格的值。

请参阅Oracle 数据库 SQL 语言引用中关于此格式模型修饰符的其他讨论

FX

是的

需要在字符数据和格式模型之间进行精确匹配。

请参阅Oracle 数据库 SQL 语言引用中关于此格式模型修饰符的其他讨论

HH
HH12

是的

一天的小时 (1-12)。

HH24

是的

一天的小时 (0-23)。

IW
 

按 ISO 8601 标准定义的年度日历周 (1-52 或 1-53)。

  • 日历周从星期一开始。

  • 一年中的第一个日历周包括1月4日。

  • 一年中的第一个日历周可能包括12月29日、30和31。

  • 一年的最后一个日历周可能包括1月1日、2和3。

IYYY
 

4位数年份, 包含日历周, 如 ISO 8601 标准所定义。

IYY
IY
I
 

按 ISO 8601 标准定义的, 包含日历周的年份的最后3、2或1位数字。

J

是的

朱利安天;自4712年1月1日公元前以来的天数。用 J 指定的数字必须是整数。

MI

是的

分钟 (0-59)。

MM

是的

月 (01-12;1月 = 01)。

MON

是的

月份的缩写名称。

MONTH

是的

月份的名称。

PM
P.M.

是的

带或无句点的子午线指示器。

Q
 

年季度 (1, 2, 3, 4;1月March日 = 1)。

RM

是的

罗马数字月份 (I-XII;1月 = I)。

RR

是的

允许您仅使用两个数字存储第二十一世纪中的第二十个世纪日期。

请参阅还:"RR 日期时间格式元素"

RRRR

是的

全年。接受4位或2位输入。如果为2位数, 则提供与 RR 相同的返回。如果不希望此功能, 请输入4位数字的年份。

SS

是的

第二 (0-59)。

SSSSS

是的

秒通过午夜 (0-86399)。

TS

是的

以短时间格式返回值。使时间组件 (小时、分钟等等) 的外观取决于NLS_TERRITORYNLS_LANGUAGE初始化参数。

限制:只能用空白分隔的DLDS元素指定此格式。

TZD 

是的

日光保存信息。TZD 值是一个具有夏时制信息的缩写时区字符串。它必须与 TZR 中指定的区域对应。在时间戳和间隔格式中有效, 但在DATE格式中无效。

示例:PST(美国/太平洋标准时间);PDT(用于美国/太平洋夏时制时间)。

TZH

是的

时区小时。(请参见TZM格式元素。在时间戳和间隔格式中有效, 但在DATE格式中无效。

示例:'HH:MI:SS.FFTZH:TZM'.

TZM

是的

时区分钟。(请参见TZH格式元素。在时间戳和间隔格式中有效, 但在DATE格式中无效。

示例:'HH:MI:SS.FFTZH:TZM'.

TZR

是的

时区区域信息。该值必须是数据库中支持的时区区域名称之一。在时间戳和间隔格式中有效, 但在DATE格式中无效。

示例:美国/太平洋

WW
 

一年中的一周 (1-53), 1 周开始于一年中的第一天, 并持续到一年中的第七天。

W
 

月的周 (1-5), 其中1周开始于本月的第一天, 并在7日结束。

X

是的

本地基数字符。

示例:'HH:MI:SSXFF'.

Y,YYY

是的

在这个位置用逗号的年份。

YEAR
SYEAR
 

年, 阐明;S前缀 BC 日期与减号 (-)。

YYYY
SYYYY

是的

4位数年份;S前缀 BC 日期与减号。

YYY
YY
Y

是的

年的最后3、2或1位数。


Oracle 数据库将字符串转换为具有一定灵活性的日期。例如, 当使用TO_DATE函数时, 包含标点字符的格式模型与缺少部分或全部这些字符的输入字符串匹配, 前提是输入字符串中的每个数值元素都包含最大允许数量的数字, 例如, 两位数字 ' 05 ' 为 ' MM ' 或四位数字 ' 2007 ' 的 '。以下语句不返回错误:

SELECT TO_CHAR(TO_DATE('0207','MM/YY'), 'MM/YY') FROM DUAL;

TO_CH
-----
02/07
 

但是, 下面的格式字符串确实返回了一个错误, 因为 FX (格式准确) 格式修饰符要求表达式和格式字符串的精确匹配:

SELECT TO_CHAR(TO_DATE('0207', 'fxmm/yy'), 'mm/yy') FROM DUAL;
SELECT TO_CHAR(TO_DATE('0207', 'fxmm/yy'), 'mm/yy') FROM DUAL;
                       *
ERROR at line 1:
ORA-01861: literal does not match format string

任何非字母数字字符都允许与格式模型中的标点字符匹配。例如, 以下语句不返回错误:

SELECT TO_CHAR (TO_DATE('02#07','MM/YY'), 'MM/YY') FROM DUAL;

TO_CH
-----
02/07

日期时间格式元素和全球化支持

某些 datetime 格式元素的功能取决于使用 Oracle 数据库的国家和语言。例如, 这些日期时间格式元素返回拼写宝贵 es:

  • 周一

  • 一天

  • Dy

  • 公元前或 AD 或公元前或公元

  • AM、下午或下午

返回这些值的语言是用初始化参数NLS_DATE_LANGUAGE显式指定的, 也可以用初始化参数NLS_LANGUAGE隐式表示。YEARSYEARdatetime 格式元素返回的值始终为英文。

datetime 格式元素D返回一周中的天数 (1-7)。编号为1的周的日期由初始化参数NLS_TERRITORY隐式指定.

ISO 标准日期格式元素

Oracle 根据 ISO 标准计算日期时间格式元素 IYYY、国际青年年、IY、I 和爱德返回的值。有关这些值与日期时间格式元素返回的时间间隔 (YYY、YY、Y 和 WW) 之间的差异的信息, 请参阅 Oracle 数据库全球化支持指南中的全球化支持讨论。.

RR Datetime 格式元素

RR datetime 格式元素类似于YY datetime 格式元素, 但它为在其他世纪中存储日期值提供了额外的灵活性。RR datetime 格式元素允许您在第二十一世纪中仅指定年份的最后两位数来存储第二十个世纪日期。

如果将TO_DATE函数与YY datetime 格式元素一起使用, 则返回的年份始终具有与当前年份相同的前2位数字。如果改用RR datetime 格式元素, 则返回值的世纪将根据指定的两位数年份和当前年份的最后两位数字而变化。

那是:

  • 如果指定的两位数年份为00到 49, 则

    • 如果当前年份的最后两位数为00到 49, 则返回的年份与当前年份的前两位数相同。

    • 如果当前年份的最后两位数为50到 99, 则返回年份的前2位数比当前年份的前2位数高1。

  • 如果指定的两位数年份为50到 99, 则

    • 如果当前年份的最后两位数为00到 49, 则返回年份的前2位数比当前年份的前2位数低1。

    • 如果当前年份的最后两位数为50到 99, 则返回的年份与当前年份的前两位数相同。

下面的示例演示 RR datetime 格式元素的行为。

RR Datetime 格式示例

假定这些查询在1950和1999之间发出:

SELECT TO_CHAR(TO_DATE('27-OCT-98', 'DD-MON-RR'), 'YYYY') "Year" FROM DUAL;

Year
----
1998

SELECT TO_CHAR(TO_DATE('27-OCT-17', 'DD-MON-RR'), 'YYYY') "Year" FROM DUAL; 

Year
----
2017

现在假设这些查询在2000和2049之间发出:

SELECT TO_CHAR(TO_DATE('27-OCT-98', 'DD-MON-RR'), 'YYYY') "Year" FROM DUAL; 

Year
----
1998 

SELECT TO_CHAR(TO_DATE('27-OCT-17', 'DD-MON-RR'), 'YYYY') "Year" FROM DUAL; 

Year
----
2017

请注意, 无论这些查询是在2000年之前还是之后发出的, 都返回相同的值。RR datetime 格式元素允许您编写 SQL 语句, 将返回与其前两个数字不同的年份相同的值。

日期时间格式元素后缀

表 3-16列出了可以添加到 datetime 格式元素中的后缀:

表3-16 日期格式元素后缀

后缀 意义 示例元素 示例值

序号

DDTH

4TH

Sp

拼写数字

DDSP

FOUR

SPTH 或 THSP

拼字, 序号

DDSPTH

FOURTH


日期格式元素后缀的注释:

  • 将这些后缀之一添加到 datetime 格式元素时, 返回值始终为英文。

  • 日期时间后缀仅对输出格式有效。不能使用它们将日期插入到数据库中。

格式化模型修饰符

FMFX修饰符, 用于TO_CHAR函数中的格式模型, 控制空白填充和精确的格式检查。

修饰符可以多次出现在格式模型中。在这种情况下, 每个后续事件都将切换修饰符的效果。它的效果在模型的第一个匹配项之后被启用, 然后对其第二个后面的部分禁用, 然后为第三个后面的部分已重新启用, 等等。

调频填充模式。Oracle 使用尾随空白字符和前导零将格式元素填充为常量宽度。宽度等于相关格式模型的最大元素的显示宽度:

  • 数值元素用前导零填充到元素允许的最大值的宽度。例如, YYYY HH24元素将被填充为四位数字 ("9999" 的长度)、到两个数字 ("23" 的长度) 和 DDD 到三个数字 ("366" 的长度). DDD

  • 字符元素MONTHMONDAYDY都用尾随空格填充, 宽度为最长的完整月份名称、最长的缩写月份名称、最长的完整日期名称或最长的缩写日期名称, 分别在由NLS_DATE_LANGUAGENLS_CALENDAR参数的值确定的有效名称之间。例如, 当NLS_DATE_LANGUAGEAMERICAN并且NLS_CALENDARGREGORIAN(默认值) 时,MONTH的最大元素为SEPTEMBER, 因此MONTH的所有值将格式元素填充为九个显示字符。NLS_DATE_LANGUAGENLS_CALENDAR参数的值在第三个参数中指定为TO_CHARTO_* datetime 函数, 或者从当前的 NLS 环境中检索它们。会话。

  • 字符元素 RM 用尾随空格填充, 长度为 4, 即 "viii" 的长度。

  • 其他字符元素和拼写出来的数字 (SP、 SPTHTHSP后缀) 不会被填充。

FM修饰符在TO_CHAR函数的返回值中取消上述填充。

外汇格式准确。此修饰符指定TO_DATE函数的字符参数和 datetime 格式模型的精确匹配:

  • 字符参数中的标点符号和引号文本必须与格式模型的相应部分完全匹配 (大小写除外)。

  • 字符参数不能有多余的空格。如果没有FX, Oracle 将忽略额外的空白。

  • 字符参数中的数字数据必须与格式模型中的相应元素具有相同的位数。如果没有FX, 字符参数中的数字可以省略前导零。

    当启用FX时, 您可以使用FM修饰符禁用此检查前导零。

如果字符参数的任何部分违反了上述任何条件, 则 Oracle 将返回一条错误消息。

格式模型示例

下面的语句使用日期格式模型返回字符表达式:

SELECT TO_CHAR(SYSDATE, 'fmDDTH') || ' of ' ||
       TO_CHAR(SYSDATE, 'fmMonth') || ', ' ||
       TO_CHAR(SYSDATE, 'YYYY') "Ides" 
  FROM DUAL; 

Ides 
------------------ 
3RD of April, 2008

前面的语句还使用FM修饰符。如果省略FM , 则月份将空白填充为九个字符:

SELECT TO_CHAR(SYSDATE, 'DDTH') || ' of ' ||
   TO_CHAR(SYSDATE, 'Month') || ', ' ||
   TO_CHAR(SYSDATE, 'YYYY') "Ides"
  FROM DUAL; 

Ides 
----------------------- 
03RD of April    , 2008 

下面的语句使用包含两个连续单引号的日期格式模型在返回值中放置一个引号:

SELECT TO_CHAR(SYSDATE, 'fmDay') || '''s Special' "Menu"
  FROM DUAL; 

Menu 
----------------- 
Tuesday's Special 

两个连续的单引号可用于在格式模型中的字符文本中相同的目的。

表 3-17显示以下语句是否满足不同值的char和 'fmt材料 ' 使用FX的匹配条件 (名为table的表有一列date_column数据类型的列DATE):

UPDATE table 
  SET date_column = TO_DATE(char, 'fmt');

表3-17 与 FX 格式模型修饰符匹配的字符数据和格式模型

字符 fmt' 匹配还是错误?

'15/ JAN /1998'

'DD-MON-YYYY'

Match

' 15! JAN % /1998'

'DD-MON-YYYY'

Error

'15/JAN/1998'

'FXDD-MON-YYYY'

Error

'15-JAN-1998'

'FXDD-MON-YYYY'

Match

'1-JAN-1998'

'FXDD-MON-YYYY'

Error

'01-JAN-1998'

'FXDD-MON-YYYY'

Match

'1-JAN-1998'

'FXFMDD-MON-YYYY'

Match


返回值的格式: 示例可以使用格式模型指定 Oracle 用于将值从数据库返回到您的格式。

下面的语句选择部门80中雇员的工资, 并使用TO_CHAR函数将这些工资转换为字符值, 格式设置由数字格式模型 "$99,990.99 " 指定':

SELECT last_name employee, TO_CHAR(salary, '$99,990.99')
  FROM employees
  WHERE department_id = 80;

由于这种格式模型, Oracle 返回的工资与领先的美元符号, 逗号每三位数, 和两个小数位。

下面的语句选择从部门20雇用每个雇员的日期, 并使用TO_CHAR函数将这些日期转换为字符串, 其格式由日期格式模型 "fmMonth DD" 指定DD,YYYY':

SELECT last_name employee, TO_CHAR(hire_date,'fmMonth DD, YYYY') hiredate
  FROM employees
  WHERE department_id = 20;

使用此格式模型, Oracle 返回的租用日期没有空白填充 (由fm指定)、当天的两位数字以及该年份中包含的世纪。

提供正确的格式模型: 示例 插入或更新列值时, 指定值的数据类型必须与列的列数据类型相对应。可以使用格式模型指定要从一种数据类型转换为列所需的另一种数据类型的值的格式。

例如, 插入到DATE列中的值必须是DATE数据类型的值或默认日期格式的字符串 (Oracle 将默认日期格式的字符串隐式转换为DATE数据类型)。如果该值是另一种格式, 则必须使用TO_DATE函数将该值转换为DATE数据类型。还必须使用格式模型指定字符串的格式。

下面的语句使用Hunold's TO_DATE函数与格式掩码 "Hunold", 将字符串 "2008 05 20" 转换为DATE值, 从而更新租用日期:

UPDATE employees 
  SET hire_date = TO_DATE('2008 05 20','YYYY MM DD') 
  WHERE last_name = 'Hunold';

字符串到日期的转换规则

当将字符串值转换为日期值时 (除非已在格式模型中使用FXFXFM修饰符来控制精确的格式检查), 则应用以下附加格式规则:

  • 如果指定了数字格式元素 (包括前导零) 的所有数字, 则可以从日期字符串中省略包含在格式字符串中的标点符号。例如, 为两位数的格式元素 (如 MM、DD 和 YY) 指定02而不是2。

  • 可以省略从日期字符串中的格式字符串末尾找到的时间字段。

  • 可以在 date 字符串中使用任何非字母数字字符来匹配格式字符串中的标点符号。

  • 如果 datetime 格式元素与日期字符串中的相应字符之间的匹配失败, 则 Oracle 尝试其他格式元素, 如表 3-18所示.

表 3-18 Oracle 格式匹配

原始格式元素 其他格式元素尝试代替原始
'MM'

'MON''MONTH'

'MON

'MONTH'

'MONTH'

'MON'

'YY'

'YYYY'

'RR'

'RRRR'


XML 格式模型

SYS_XMLGEN函数返回包含 XML 文档的类型为XMLType的实例。Oracle 提供了XMLFormat对象, 它允许您格式化SYS_XMLGEN函数的输出。

表 3-19列出并描述了XMLFormat对象的属性。实现此类型的函数跟随表。

表 3-19 XMLFormat 对象的属性

属性 数据类型 目的

enclTag

VARCHAR2(4000)

SYS_XMLGEN函数结果的封闭标记的名称。如果函数的输入是列名, 则默认值为列名。否则, 默认值为ROWschemaType设置为USE_GIVEN_SCHEMA时, 此属性还提供 XMLSchema 元素的名称。

schemaType

VARCHAR2(100)

输出文档的架构生成类型。有效值为 "NO_SCHEMA" 和 "USE_GIVEN_SCHEMA"。默认值为 "NO_SCHEMA "'.

schemaName

VARCHAR2(4000)

如果schemaType的值为 "USE_GIVEN_SCHEMA", 则 Oracle 使用的目标架构的名称。如果指定schemaName, 则 Oracle 使用封闭标记作为元素名称。

targetNameSpace

VARCHAR2(4000)

如果指定了架构 (即schemaTypeGEN_SCHEMA_*USE_GIVEN_SCHEMA , 则目标命名空间)

dburlPrefix

VARCHAR2(4000)

指定WITH_SCHEMA时要使用的数据库的 URL。如果未指定此属性, 则 Oracle 将该 url 声明为相对 url 引用。

processingIns

VARCHAR2(4000)

用户提供的处理指令, 附加到元素前的函数输出的顶部。


实现XMLFormat对象的函数如下所示:

STATIC FUNCTION createFormat(
     enclTag IN varchar2 := 'ROWSET',
     schemaType IN varchar2 := 'NO_SCHEMA',
     schemaName IN varchar2 := null,
     targetNameSpace IN varchar2 := null,
     dburlPrefix IN varchar2 := null, 
     processingIns IN varchar2 := null) RETURN XMLGenFormatType
       deterministic parallel_enable,
  MEMBER PROCEDURE genSchema (spec IN varchar2),
  MEMBER PROCEDURE setSchemaName(schemaName IN varchar2),
  MEMBER PROCEDURE setTargetNameSpace(targetNameSpace IN varchar2),
  MEMBER PROCEDURE setEnclosingElementName(enclTag IN varchar2), 
  MEMBER PROCEDURE setDbUrlPrefix(prefix IN varchar2),
  MEMBER PROCEDURE setProcessingIns(pi IN varchar2),
  CONSTRUCTOR FUNCTION XMLGenFormatType (
     enclTag IN varchar2 := 'ROWSET',
     schemaType IN varchar2 := 'NO_SCHEMA',
     schemaName IN varchar2 := null,
     targetNameSpace IN varchar2 := null,
     dbUrlPrefix IN varchar2 := null, 
     processingIns IN varchar2 := null) RETURN SELF AS RESULT
      deterministic parallel_enable,
  STATIC function createFormat2(
      enclTag in varchar2 := 'ROWSET',
      flags in raw) return sys.xmlgenformattype 
      deterministic parallel_enable
);

猜你喜欢

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