📄 第三章 pl-sql数据类型 - pl-sql用户指南与参考 - whatiswhat.htm
字号:
<LI>TIMESTAMP WITH LOCAL TIME ZONE </LI></UL>
<P>TIMESTAMP WITH LOCAL TIME ZONE是对TIMESTAMP WITH TIME
ZONE的扩展,它的语法如下: </P>
<BLOCKQUOTE>
<TABLE>
<TBODY>
<TR>
<TD
noWrap><STRONG>TIMESTAMP</STRONG>[(precision)] <STRONG>WITH</STRONG> LOCAL <STRONG>TIME</STRONG> <STRONG>ZONE</STRONG>
</TD></TR></TBODY></TABLE></BLOCKQUOTE>
<P>TIMESTAMP WITH LOCAL TIME ZONE的用途和TIMESTAMP WITH TIME
ZONE相似,它们不同之处在于,当我们往数据库中插入TIMESTAMP WITH LOCAL TIME
ZONE类型数据的时候,数据会被转成数据库的时区,并且时区位移并不会存放在数据库中。当进行数据检索时,Oracle会按我们本地会话的时区设置返回值。下面就是一个使用TIMESTAMP
WITH LOCAL TIME ZONE的例子: </P>
<BLOCKQUOTE>
<TABLE>
<TBODY>
<TR>
<TD
noWrap><STRONG>DECLARE</STRONG><BR> LOGOFF <STRONG>TIMESTAMP</STRONG> ( 3 ) <STRONG>WITH</STRONG> LOCAL <STRONG>TIME</STRONG> <STRONG>ZONE</STRONG>;<BR><STRONG>BEGIN</STRONG><BR> <STRONG>NULL</STRONG>;<BR> ...<BR><STRONG>END</STRONG>;
</TD></TR></TBODY></TABLE></BLOCKQUOTE>
<P>我们不可以用文字值为这种类型的变量赋值。</P>
<UL>
<LI>INTERVAL YEAR TO MONTH </LI></UL>
<P>我们可以使用INTERVAL YEAR TO MONTH类型用来保存年月的间隔,语法如下: </P>
<BLOCKQUOTE>
<TABLE>
<TBODY>
<TR>
<TD
noWrap><STRONG>INTERVAL</STRONG> <STRONG>YEAR</STRONG>[(precision)] <STRONG>TO</STRONG> <STRONG>MONTH</STRONG>
</TD></TR></TBODY></TABLE></BLOCKQUOTE>
<P>precision指定间隔的年数。参数precision不能是常量或变量,其范围在1到4之间,默认值是2,下面的例子中声明了一个INTERVAL
YEAR TO MONTH类型的变量,并把间隔值101年3个月赋给它:</P>
<BLOCKQUOTE>
<TABLE>
<TBODY>
<TR>
<TD
noWrap><STRONG>DECLARE</STRONG><BR> lifetime <STRONG>INTERVAL</STRONG> <STRONG>YEAR</STRONG>(3)<STRONG>TO</STRONG> <STRONG>MONTH</STRONG>;<BR><STRONG>BEGIN</STRONG><BR> lifetime := <STRONG>INTERVAL</STRONG> <EM>'101-3'</EM> <STRONG>YEAR</STRONG> <STRONG>TO</STRONG> <STRONG>MONTH</STRONG>; <EM>-- interval literal</EM><BR> lifetime := <EM>'101-3'</EM>; <EM>-- implicit conversion from character type</EM><BR> lifetime := <STRONG>INTERVAL</STRONG> <EM>'101'</EM> <STRONG>YEAR</STRONG>; <EM>-- Can specify just the years</EM><BR> lifetime := <STRONG>INTERVAL</STRONG> <EM>'3'</EM> <STRONG>MONTH</STRONG>; <EM>-- Can specify just the months</EM><BR> ...<BR><STRONG>END</STRONG>;
</TD></TR></TBODY></TABLE></BLOCKQUOTE>
<UL>
<LI>INTERVAL DAY TO SECOND </LI></UL>
<P>我们可以使用INTERVAL DAY TO
SECOND数据类型存储和操作天、小时、分钟和秒,语法如下:</P>
<BLOCKQUOTE>
<TABLE>
<TBODY>
<TR>
<TD
noWrap><STRONG>INTERVAL</STRONG> <STRONG>DAY</STRONG>[(leading_precision)] <STRONG>TO</STRONG> <STRONG>SECOND</STRONG>[(fractional_seconds_precision)]
</TD></TR></TBODY></TABLE></BLOCKQUOTE>leading_precision和fractional_seconds_precision分别指定了天数和秒数。这两个值都不可以用常量或变量指定,且只能使用范围在0到9之间的整数文字为其赋值。它们的默认值分别为2和6。下面的例子中,我们声明了一个
INTERVAL DAY TO SECOND类型的变量:
<P> </P>
<BLOCKQUOTE>
<TABLE>
<TBODY>
<TR>
<TD
noWrap><STRONG>DECLARE</STRONG><BR> lag_time <STRONG>INTERVAL</STRONG> <STRONG>DAY</STRONG>(3)<STRONG>TO</STRONG> <STRONG>SECOND</STRONG>(3);<BR><STRONG>BEGIN</STRONG><BR> <STRONG>IF</STRONG> lag_time > <STRONG>INTERVAL</STRONG> <EM>'6'</EM> <STRONG>DAY</STRONG> <STRONG>THEN</STRONG> ...<BR> ...<BR><STRONG>END</STRONG>;
</TD></TR></TBODY></TABLE></BLOCKQUOTE>
<P class=title2>7、Datetime和Interval算法</P>
<P>PL/SQL允许我们创建日期时间和间隔表达式。下面列表显示了可以在表达式中使用的操作符:</P>
<TABLE id=table-list>
<TBODY>
<TR>
<TH id=table-list-head>操作数 1</TH>
<TH id=table-list-head>操作符</TH>
<TH id=table-list-head>操作数 2</TH>
<TH id=table-list-head>返回类型</TH></TR>
<TR>
<TD>日期时间</TD>
<TD align=middle>+</TD>
<TD>时间间隔</TD>
<TD>日期时间</TD></TR>
<TR>
<TD>日期时间</TD>
<TD align=middle>-</TD>
<TD>时间间隔</TD>
<TD>日期时间</TD></TR>
<TR>
<TD>时间间隔</TD>
<TD align=middle>+</TD>
<TD>日期时间</TD>
<TD>日期时间</TD></TR>
<TR>
<TD>日期时间</TD>
<TD align=middle>-</TD>
<TD>日期时间</TD>
<TD>时间间隔</TD></TR>
<TR>
<TD>时间间隔</TD>
<TD align=middle>+</TD>
<TD>时间间隔</TD>
<TD>时间间隔</TD></TR>
<TR>
<TD>时间间隔</TD>
<TD align=middle>-</TD>
<TD>时间间隔</TD>
<TD>时间间隔</TD></TR>
<TR>
<TD>时间间隔</TD>
<TD align=middle>*</TD>
<TD>数字</TD>
<TD>时间间隔</TD></TR>
<TR>
<TD>数字</TD>
<TD align=middle>*</TD>
<TD>时间间隔</TD>
<TD>时间间隔</TD></TR>
<TR>
<TD>时间间隔</TD>
<TD align=middle>/</TD>
<TD>数字</TD>
<TD>时间间隔</TD></TR></TBODY></TABLE>
<P>我们还可以使用各种函数来操作日期时间类型,如EXTRACT等。</P>
<P class=title2>8、使用日期和时间子类型来避免"切断"问题</P>
<P>对于某些日期和时间类型的默认精度都要小于它们对应的最大精度。例如,DAY TO
SECOND的默认精度是DAY(2) TO SECOND(6),而最大精度是DAY(9) TO
SECOND(9)。为了避免在使用这些类型进行赋值和传递参数时丢失精度,我们可以声明它们的子类型,这些类型都采用了最大的精度:
</P>
<BLOCKQUOTE>
<TABLE>
<TBODY>
<TR>
<TD
noWrap>TIMESTAMP_UNCONSTRAINED<BR><BR>TIMESTAMP_TZ_UNCONSTRAINED<BR><BR>TIMESTAMP_LTZ_UNCONSTRAINED<BR><BR>YMINTERVAL_UNCONSTRAINED<BR><BR>DSINTERVAL_UNCONSTRAINED
</TD></TR></TBODY></TABLE></BLOCKQUOTE>
<P class=title1>二、用户自定义子类型</P>
<P>每个PL/SQL基类型都有对应的值集合和操作符集合。子类同样会指定同其基类型相同的值集合和操作符集合的子集作为它自己的值集合和操作符集合。所以说子类并不是一个新类型,它只是在基类的基础上添加了一个可选的约束。</P>
<P>子类可以增加可读性和兼容性。PL/SQL在STANDARD包里预定义了一些子类型。如下例: </P>
<BLOCKQUOTE>
<TABLE>
<TBODY>
<TR>
<TD
noWrap><STRONG>SUBTYPE</STRONG> CHARACTER <STRONG>IS</STRONG> <STRONG>CHAR</STRONG>;<BR><STRONG>SUBTYPE</STRONG> <STRONG>INTEGER</STRONG> <STRONG>IS</STRONG> <STRONG>NUMBER</STRONG>(38, 0); <EM>-- allows only whole numbers</EM>
</TD></TR></TBODY></TABLE></BLOCKQUOTE>
<P>子类型CHARACTER和基类型完全一样,所以CHARACTER是一个未作约束的子类型。但是,子类型INTEGER将基类NUMBER的值集合的子集作为自己的值集合,所以INTEGER是一个约束的子类型。</P>
<P class=title2>1、定义子类型</P>
<P>我们可以在任何PL/SQL块、子程序或包中定义自己的子类型,语法如下: </P>
<BLOCKQUOTE>
<TABLE>
<TBODY>
<TR>
<TD
noWrap><STRONG>SUBTYPE</STRONG> subtype_name <STRONG>IS</STRONG> base_type[(constraint)] [<STRONG>NOT</STRONG> <STRONG>NULL</STRONG>];
</TD></TR></TBODY></TABLE></BLOCKQUOTE>
<P>subtype_name就是声明的子类型的名称,base_type可以是任何标量类型或用户定义类型,约束只是用于限定基类型的精度和数值范围,或是最大长度。下面举几个例子:</P>
<BLOCKQUOTE>
<TABLE>
<TBODY>
<TR>
<TD
noWrap><STRONG>DECLARE</STRONG><BR> <STRONG>SUBTYPE</STRONG> birthdate <STRONG>IS</STRONG> <STRONG>DATE</STRONG> <STRONG>NOT</STRONG> <STRONG>NULL</STRONG>; <EM>-- based on DATE type</EM><BR><BR> <STRONG>SUBTYPE</STRONG> counter <STRONG>IS</STRONG> <STRONG>NATURAL</STRONG>; <EM>-- based on NATURAL subtype</EM><BR><BR>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -