⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 第三章 pl-sql数据类型 - pl-sql用户指南与参考 - whatiswhat.htm

📁 sql初学者不错的教程
💻 HTM
📖 第 1 页 / 共 5 页
字号:
                        <P>我们可以将LONG类型的值插入字段类型为LONG的数据库中,因为在数据库中LONG的长度是2**31字节;但是,不可以从LONG字段中检索超过32760字节的字符放到LONG类型变量中去。同样,对于LONG 
                        RAW类型来说,这条规则同样适用,在数据库中它的最大长度也是2**31字节,而变量的长度在32760字节以内。LONG类型字段可以存储文本、字符数组或短文等。我们可以对LONG字段进行UPDATE、INSERT和SELECT操作,但不能在表达式、SQL函数调用、或某个SQL子句(如: 
                        WHERE、GROUP BY和CONNECT BY)中使用它。 </P>
                        <P>注意:在SQL语句中,PL/SQL会将LONG类型的值绑定成VARCHAR2类型,而不是LONG。但是,如果被绑定的VARCHAR2值超过 
                        4000个字节,Oracle会自动地将绑定类型转成LONG,但LONG并不能应用在SQL函数中,所以,这时我们就会得到一个错误消息。 
                        </P>
                        <UL>
                          <LI>RAW </LI></UL>
                        <P>我们可以使用RAW数据类型来存储二进制数据或字节串。例如,一个RAW类型的变量可以存储一个数字化图形。RAW类型数据和VARCHAR2类型数据类似,只是PL/SQL不对其进行解析而已。同样,在我们把RAW数据从一个系统传到另一个系统时,Oracle 
                        Net也不会对它做字符集转换。RAW类型包含了一个可以让我们指定最大长度的可选参数,上限为32767字节,语法如下:</P>
                        <BLOCKQUOTE>
                          <TABLE>
                            <TBODY>
                            <TR>
                              <TD noWrap><STRONG>RAW</STRONG>(maximum_size) 
                            </TD></TR></TBODY></TABLE></BLOCKQUOTE>
                        <P>我们不能使用常量或变量来指定这个参数;而且参数的范围必须是在1到32767范围内。在数据库中RAW类型字段的最大长度是2000个字节,所以,不可以把超过2000字节的内容放到RAW类型字段中。我们可以把任何RAW类型插入到LONG 
                        RAW类型的数据库字段中,因为LONG RAW在数据库中是2**31,但是不能把超过32767字节的LONG 
                        RAW类型放入RAW变量中。 </P>
                        <UL>
                          <LI>ROWID和UROWID </LI></UL>
                        <P>在Oracle内部,每个数据表都有一个伪列ROWID,用于存放被称为ROWID的二进制值。每个ROWID代表了一行数据的存储地址。物理 
                        ROWID能够标识普通数据表中的一行信息,而逻辑ROWID能够标识索引组织表(index-organized 
                        table)中的一行信息。其中ROWID类型只能存储物理内容,而UROWID(universal 
                        rowid)类型可以存储物理,逻辑或外来(non-Oracle)ROWID。 </P>
                        <P>建议:只有在旧的应用程序中,为了兼容性我们才使用ROWID数据类型。对于新的应用程序,应该使用UROWID数据类型。 
                        </P>
                        <P>当我们把查询出来的ROWID放到ROWID变量时,可以使用内置函数ROWIDTOCHAR,这个函数能把二进制内容转换成18个字节的字符串;还有一个与之对应的CHARTOROWID函数,可以对该过程进行反操作,如果转换过程中发现字符串并不是一个有效的ROWID时,PL/SQL就会抛出预定义异常SYS_INVALID_ROWID。UROWID变量和字符串之间进行转换也可以直接使用赋值操作符。这时,系统会隐式地实现UROWID和字符类型之间的转换。 
                        </P>
                        <P>物理ROWID(Physical 
                        Rowid)可以让我们快速的访问某些特定的行。只要行存在,它的物理ROWID就不会改变。高效稳定的物理ROWID在查询行集合、操作整个集合和更新子集是很有用的。例如,我们可以在UPDATE或DELETE语句的WHERE子句中比较UROWID变量和ROWID伪列来找出最近一次从游标中取出的行数据。 
                        </P>
                        <P>物理ROWID有两种形式。10字节扩展ROWID格式(10-byte extended rowid 
                        format)支持相对表空间块地址并能辨识分区表和非分区表中的行记录。6字节限定ROWID格式支持向后兼容。 
                        </P>
                        <P>扩展ROWID使用检索出来的每一行记录的物理地址的base-64编码。例如,在SQL*Plus(隐式地将ROWID转换成字符串)中的查询: 
                        </P>
                        <BLOCKQUOTE>
                          <TABLE>
                            <TBODY>
                            <TR>
                              <TD 
                                noWrap><STRONG>SQL</STRONG>&gt;&nbsp;<STRONG>SELECT</STRONG>&nbsp;<STRONG>ROWID</STRONG>,&nbsp;ename<BR><STRONG>SQL</STRONG>&gt;&nbsp;&nbsp;<STRONG>FROM</STRONG>&nbsp;emp<BR><STRONG>SQL</STRONG>&gt;&nbsp;<STRONG>WHERE</STRONG>&nbsp;empno&nbsp;=&nbsp;7788;<BR>ROWID&nbsp;ENAME<BR>------------------&nbsp;----------<BR>AAAAqcAABAAADFNAAH&nbsp;SCOTT<BR></TD></TR></TBODY></TABLE></BLOCKQUOTE>
                        <P>&nbsp;</P>
                        <P>OOOOOOFFFBBBBBBRRR这样的形式有四部分组成: </P>
                        <OL>
                          <LI>"000000"代表数据对象号(data object 
                          number),如上例中的"AAAAqc",能够辨识数据库段。同一段中的模式对象,都有着相同的数据对象号。 
                          <LI>"FFF"代表文件号(file 
                          number),如上例中的"AAB",能辨识出包含行的数据文件。在数据库中,文件号是唯一的。 
                          <LI>"BBBBBB"代表块号(block 
                          number),如上例中的"AAADFN",能辨识出包含行的数据块。块号是与它们所在的数据文件相关,而不是表空间。所以,两个在同一表空间的行数据,如果它们处于不同的数据文件中,也可能有着相同的块号。 

                          <LI>"RRR"代表了行号(row number),如上例中的"AAH",可以辨识块中的行数据。 
                        </LI></OL>
                        <P>逻辑ROWID为访问特定行提供了最快的访问速度。Oracle在索引组织表基础上使用它们构建二级索引。逻辑ROWID没有持久的物理地址,当新数据被插入时,它的值就会在数据块上偏移。但是,如果一个行数据的物理位置发生变化,它的逻辑ROWID就无效了。 
                        </P>
                        <UL>
                          <LI>VARCHAR2 </LI></UL>
                        <P>我们可以使用VARCHAR2类型来存储变长的字符数据。至于数据在数据库中的内部表现形式要取决于数据库的字符集。VARCHAR2类型需要指明数据长度,这个参数的上限是32767字节。语法如下: 
                        </P>
                        <BLOCKQUOTE>
                          <TABLE>
                            <TBODY>
                            <TR>
                              <TD 
                                noWrap><STRONG>VARCHAR2</STRONG>(maximum_size&nbsp;[<STRONG>CHAR</STRONG>&nbsp;|&nbsp;BYTE]) 
                              </TD></TR></TBODY></TABLE></BLOCKQUOTE>
                        <P>我们不能使用常量或变量来指定maximum_size值,maximum_size值的有效范围在1到32767之间。</P>
                        <P>对于长度不同的VARCHAR2类型数据,PL/SQL对它们的处理方式也是不同的。值小的PL/SQL会优先考虑到它的性能问题,而对于值大的 
                        PL/SQL会优先考虑到内存的使用效率问题。截止点(cutoff 
                        point)为2000个字节。在2000字节以下,PL/SQL会一次性分配我们声明时所指定大小的空间容纳实际的值;2000字节或2000字节以上时,PL/SQL会动态的分配VARCHAR2的存储容量。比如我们声明两个VARCHAR2类型的变量,一个长度是1999字节,一个是2000字节,如果我们把长度为500字节的值分别分配给这两个变量,那么前者占用的空间就是1999字节而后者只需500字节。</P>
                        <P>如果我们采用字节形式而非字符形式指定最大值时,VARCHAR2(n)变量就有可能太小而不能容纳n个多字节字符。为了避免这个问题,就要使用 
                        VARCHAR2(n 
                        CHAR)形式进行定义,这样,即使字符中包含多字节字符也不会出问题。所以,对于双字节或多字节字符集,我们可以指定单字节字符集中字符个数的1/2或 
                        1/3。</P>
                        <P>虽然PL/SQL字符变量相对比较长,但VARCHAR2类型的数据库字段最大长度为4000个字节。所以,不能把字节超过4000的VARCHAR2类型值插入VARCHAR2类型的数据库字段中。</P>
                        <P>我们可以把任何VARCHAR2(n)值插入一个LONG类型的数据库字段,因为LONG字段最大长度为2**31字节。但是,不能把LONG字段中检索出来的长度超过32767字节的值放到VARCHAR2(n)变量中。</P>
                        <P>如果声明时不使用CHAR或BYTE限定修饰词,初始化参数NLS_LENGTH_SEMANTICS会决定默认的设置。当PL/SQL过程编译时,这个参数的设置就会被记录下来,这样,当过程失效后被重新编译时就会被重新使用。</P>
                        <UL>
                          <LI>VARCHAR2的子类型 </LI></UL>
                        <P>下面VARCHAR2的子类型的范围与VARCHAR2完全相同,它们只是VARCHAR2的一个别名而已。 
                        </P>
                        <OL>
                          <LI>STRING 
                          <LI>VARCHAR </LI></OL>
                        <P>我们可以使用这些子类型来与ANSI/ISO和IBM类型兼容。注意:目前,VARCHAR和VARCHAR2有着相同意义,但是在以后的 
                        PL/SQL版本中,为了符合SQL标准,VARCHAR有可能会作为一个单独的类型出现。所以最好使用VARCHAR2,而不是VARCHAR。 
                        </P>
                        <P class=title2>3、本地字符型</P>
                        <P>被广泛使用的单字节ASCII和EBCDIC字符集很适合表现罗马字符,但有些亚洲语言,如汉语、日语等包含了成千上万个字符,这些语言中的一个字符就需要用两个或三个字节来表示。为了处理这些语言,Oracle提供了全球化支持,允许我们处理单字节和多字节字符数据,并在字符集之间进行数据转换。 
                        Oracle还能让我们的应用程序运行在不同的语言环境中。</P>
                        <P>有了全球化支持,数字和日期格式会根据用户会话中所指定的语言约定(language 
                        convention)而自动进行调节。因此,全世界的用户可以使用他们母语来使用Oracle。 </P>
                        <P>Oracle支持两种数据库字符集和一种国家特有字符集,前者用于标识符和源代码,后者用于国家特有语言数据。NCHAR和NVARCHAR2类型用于存储本地字符集。</P>
                        <P>注意,当在数据库的不同字符集之间转换CHAR或VARCHAR2数据时,要确保数据保持良好的形式(well-formed)。</P>
                        <UL>
                          <LI>比较UTF8和AL16UTF16编码 </LI></UL>
                        <P>国家特有字符集使用Unicode来表现数据,采用UTF8或AL16UTF16编码。 </P>
                        <P>每个使用AL16UTF16编码的字符都占用2个字节。这将简化字符串的长度计算,避免采用混合语言编程时发生截断错误,但是这会比ASCII字符所组成的字符串需要更多空间。 
                        </P>
                        <P>每个使用UTF8编码的字符占用1、2或3个字节。这就能让我们把更多的字符放到变量或数据表的字段中,但这只是在大多数字符用单字节形式表现的条件下才能做到。这种编码在传递数据到字节缓冲器时可能会引起截断错误。 
                        </P>
                        <P>Oracle公司推荐使用默认的AL16UTF16编码,这样可以获取最大的运行时可靠性。如果想知道一个Unicode字符串占用多少字节,就要使用LENGTHB函数,而不是LENGTH。 
                        </P>
                        <UL>
                          <LI>NCHAR </LI></UL>
                        <P>我们用NCHAR类型来储存定长国家特有字符数据。数据的内部表现取决于数据库创建时指定的国家特有字符集,字符集可能采用变长编码(UTF8)或定长编码(AL16UTF16)。因为这种类型总是与多字节字符兼容,所以我们可以使用它支持任何Unicode字符数据。 
                        </P>
                        <P>NCHAR数据类型可接受一个可选参数来让我们指定字符的最大长度。语法如下: </P>
                        <BLOCKQUOTE>
                          <TABLE>
                            <TBODY>
                            <TR>
                              <TD noWrap>NCHAR[(maximum_size)] 
                          </TD></TR></TBODY></TABLE></BLOCKQUOTE>
                        <P>因为物理限制是32767个字节,所以在AL16UTF16编码格式下最大长度为32767/2,UTF8编码格式下是32767/3。</P>
                        <P>我们不能使用常量或变量来指定最大值,只能使用整数文字。</P>
                        <P>如果我们没有指定最大长度,它默认值就为1。这个值总是代表字符的个数,不像CHAR类型,既可以采用字符形式又可以采用字节形式。</P>
                        <BLOCKQUOTE>
                          <TABLE>
                            <TBODY>
                            <TR>
                              <TD 
                                noWrap>my_string&nbsp;NCHAR(100);&nbsp;&nbsp;&nbsp;<EM>--&nbsp;maximum&nbsp;size&nbsp;is&nbsp;100&nbsp;characters</EM> 
                              </TD></TR></TBODY></TABLE></BLOCKQUOTE>
                        <P>NCHAR在数据库字段中的最大宽度是2000字节。所以,我们不能向NCHAR字段中插入值超过2000字节的内容。</P>
                        <P>如果NCHAR的值比NCHAR字段定义的宽度要小,Oracle就会自动补上空格,填满定义的宽度。</P>
                        <P>我们可以在语句和表达式中交互使用CHAR和NCHAR值。从CHAR转到NCHAR总是安全的,但在NCHAR值转换到CHAR的过程中,如果CHAR类型不能完全表现NCHAR类型的值,就会引起数据丢失。这样的数据丢失会导致字符看起来像问号(?)。</P>
                        <UL>
                          <LI>NVARCHAR2 </LI></UL>
                        <P>我们可以使用NVARCHAR2数据类型来存储变长的Unicode字符数据。数据的内部表现取决于数据库创建时所指定的国家特有字符集,它有可能采用变长编码(UTF8)或是定长编码(AL16UTF16)。因为这个类型总与多字节兼容,我们可以用它来支持Unicode字符数据。</P>
                        <P>NVARCHAR2数据类型需要接受一个指定最大大小的参数。语法如下:</P>
                        <BLOCKQUOTE>
                          <TABLE>
                            <TBODY>
                            <TR>
                              <TD noWrap>NVARCHAR2(maximum_size) 
                          </TD></TR></TBODY></TABLE></BLOCKQUOTE>
                        <P>因为物理限制是32767个字节,所以在AL16UTF16编码格式下最大长度为32767/2,UTF8编码格式下是32767/3。</P>
                        <P>我们不能使用常量或变量来指定最大值,只能使用整数文字。</P>
                        <P>最大值总是代表字符的个数,不像CHAR类型,既可以采用字符形式又可以采用字节形式。</P>
                        <BLOCKQUOTE>
                          <TABLE>
                            <TBODY>
                            <TR>
                              <TD 
                                noWrap>my_string&nbsp;NVARCHAR2(200);&nbsp;&nbsp;&nbsp;<EM>--&nbsp;maximum&nbsp;size&nbsp;is&nbsp;200&nbsp;characters</EM> 
                              </TD></TR></TBODY></TABLE></BLOCKQUOTE>
                        <P>NVARCHAR2在数据库字段中的最大宽度是4000字节。所以,我们不能向NVARCHAR2字段中插入长度超过4000字节的值。</P>
                        <P>我们可以在语句和表达式中交互使用VARCHAR2和NVARCHAR2值。从VARCHAR2向NVARCHAR2转换总是安全的,但在 
                        NVARCHAR2值转换到VARCHAR2的过程中,如果VARCHAR2类型不能完全表现NVARCHAR2类型的值,就会引起数据丢失。这样的数据丢失会导致字符看起来像问号(?)。</P>
                        <P class=title2>4、LOB类型</P>
                        <P>LOB(large 
                        object)数据类型BFILE、BLOB、CLOB和NCLOB可以最大存储4G的无结构数据(例如:文本、图形、视频剪辑和音频等)块。并且,它们允许高效地随机地分段访问数据。</P>
                        <P>LOB类型和LONG、LONG 
                        RAW类型相比有几个不同的地方。比如,LOB(除了NCOLB)可以作为对象类型的一个属性,但LONG类型不可以。LOB的最大值是4G,而LONG只有2G。LOB支持随机访问数据,但LONG只支持顺序访问。</P>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -