📄 第五章 pl-sql集合与记录(1) - pl-sql用户指南与参考 - whatiswhat.htm
字号:
<TBODY>
<TR>
<TD
noWrap><STRONG>DECLARE</STRONG><BR> <STRONG>TYPE</STRONG> courselist <STRONG>IS</STRONG> <STRONG>TABLE</STRONG> <STRONG>OF</STRONG> <STRONG>VARCHAR2</STRONG>(16);<BR><BR> my_courses courselist := courselist(<EM>'Art 1111'</EM>,<BR> <EM>'Hist 3100'</EM>,<BR> <EM>'Engl 2005'</EM><BR> );
</TD></TR></TBODY></TABLE></BLOCKQUOTE>
<UL>
<LI>例五:空的(empty)变长数组构造函数 </LI></UL>
<P>如果在调用构造函数时不传递任何参数,就会得到一个空的(empty)集合,这里指的是集合内容为空,而不是集合本身为空:
</P>
<BLOCKQUOTE>
<TABLE>
<TBODY>
<TR>
<TD
noWrap><STRONG>DECLARE</STRONG><BR> <STRONG>TYPE</STRONG> clientele <STRONG>IS</STRONG> VARRAY(100) <STRONG>OF</STRONG> customer;<BR><BR> vips clientele := clientele(); <EM>-- initialize empty varray</EM><BR><STRONG>BEGIN</STRONG><BR> <STRONG>IF</STRONG> vips <STRONG>IS</STRONG> <STRONG>NOT</STRONG> <STRONG>NULL</STRONG> <STRONG>THEN</STRONG><BR> <EM>-- condition yields <STRONG>TRUE</STRONG></EM><BR> ...<BR> <STRONG>END</STRONG> <STRONG>IF</STRONG>;<BR><STRONG>END</STRONG>;
</TD></TR></TBODY></TABLE></BLOCKQUOTE>
<P>这种情况下,我们可以调用EXTEND方法来添加元素。 </P>
<UL>
<LI>例六:SQL语句中使用嵌套表构造函数 </LI></UL>
<P>下例中,我们把几个标量值和一个CourseList嵌套表插入到表SOPHOMORES中:</P>
<BLOCKQUOTE>
<TABLE>
<TBODY>
<TR>
<TD
noWrap><STRONG>BEGIN</STRONG><BR> <STRONG>INSERT</STRONG> <STRONG>INTO</STRONG> sophomores<BR> <STRONG>VALUES</STRONG> (5035, <EM>'Janet Alvarez'</EM>, <EM>'122 Broad St'</EM>, <EM>'FT'</EM>,<BR> courselist(<EM>'Econ 2010'</EM>,<BR> <EM>'Acct 3401'</EM>,<BR> <EM>'Mgmt 3100'</EM><BR> ));
</TD></TR></TBODY></TABLE></BLOCKQUOTE>
<UL>
<LI>例七:SQL语句中使用变长数组构造函数 </LI></UL>
<P>下例中,我们把一行数据插入到表DEPARTMENT。变长数组构造函数ProjectList()为字段PROJECTS提供数据:
</P>
<BLOCKQUOTE>
<TABLE>
<TBODY>
<TR>
<TD
noWrap><STRONG>BEGIN</STRONG><BR> <STRONG>INSERT</STRONG> <STRONG>INTO</STRONG> department<BR> <STRONG>VALUES</STRONG> (60, <EM>'Security'</EM>, 750400,<BR> projectlist(<EM>'New Badges'</EM>,<BR> <EM>'Track Computers'</EM>,<BR> <EM>'Check Exits'</EM><BR> ));
</TD></TR></TBODY></TABLE></BLOCKQUOTE>
<P class=title2>1、引用集合中的元素 </P>
<P>集合的引用包含了集合的名称和用圆括号夹起来的下标索引。下标索引决定了要选取哪个元素。语法如下:</P>
<BLOCKQUOTE>
<TABLE>
<TBODY>
<TR>
<TD noWrap>collection_name(subscript)
</TD></TR></TBODY></TABLE></BLOCKQUOTE>
<P>多数情况下,下标是一个运算结果为整数的表达式,对于使用字符串作键的关联数组来说也可能是一个VARCHAR2类型值。下标索引允许的范围如下:
</P>
<OL>
<LI>对于嵌套表,索引值的范围在1至2**31之间。
<LI>对于变长数组,索引值的范围在1至最大长度之间,最大长度是在声明时指定的。
<LI>对于使用数字作键的关联数组来说,索引值的范围在-2**31至2**31之间。
<LI>对于使用字符串作键的关联数组来说,键的长度和可用值的数量要依赖于类型声明时对VARCHAR2的长度限制和数据库字符集。
</LI></OL>
<UL>
<LI>例一:使用下标索引来引用嵌套表中的元素 </LI></UL>
<P>这里我们演示一下如何引用嵌套表NAMES中的元素:</P>
<BLOCKQUOTE>
<TABLE>
<TBODY>
<TR>
<TD
noWrap><STRONG>DECLARE</STRONG><BR> <STRONG>TYPE</STRONG> roster <STRONG>IS</STRONG> <STRONG>TABLE</STRONG> <STRONG>OF</STRONG> <STRONG>VARCHAR2</STRONG>(15);<BR><BR> names roster := roster(<EM>'J Hamil'</EM>,<BR> <EM>'D Caruso'</EM>,<BR> <EM>'R Singh'</EM><BR> );<BR><STRONG>BEGIN</STRONG><BR> <STRONG>FOR</STRONG> i <STRONG>IN</STRONG> names.FIRST .. names.LAST <STRONG>LOOP</STRONG><BR> <STRONG>IF</STRONG> names(i) = <EM>'J Hamil'</EM> <STRONG>THEN</STRONG><BR> <STRONG>NULL</STRONG>;<BR> <STRONG>END</STRONG> <STRONG>IF</STRONG>;<BR> <STRONG>END</STRONG> <STRONG>LOOP</STRONG>;<BR><STRONG>END</STRONG>;
</TD></TR></TBODY></TABLE></BLOCKQUOTE>
<UL>
<LI>例二:把嵌套表元素作为参数传递 </LI></UL>
<P>这个例子中我们在调用子程序时引用了集合中的元素:</P>
<BLOCKQUOTE>
<TABLE>
<TBODY>
<TR>
<TD
noWrap><STRONG>DECLARE</STRONG><BR> <STRONG>TYPE</STRONG> roster <STRONG>IS</STRONG> <STRONG>TABLE</STRONG> <STRONG>OF</STRONG> <STRONG>VARCHAR2</STRONG>(15);<BR><BR> names roster := roster(<EM>'J Hamil'</EM>,<BR> <EM>'D Piro'</EM>,<BR> <EM>'R Singh'</EM><BR> );<BR> i <STRONG>BINARY_INTEGER</STRONG> := 2;<BR><STRONG>BEGIN</STRONG><BR> verify_name(names(i)); <EM>-- call procedure</EM><BR><STRONG>END</STRONG>;
</TD></TR></TBODY></TABLE></BLOCKQUOTE>
<P class=title1>六、集合的赋值</P>
<P>集合可以用INSERT、UPDATE、FETCH或SELECT语句来赋值,也可以用赋值语句或调用子程序来赋值。</P>
<P>我们可以使用下面的语法来为某个指定的集合元素进行赋值: </P>
<BLOCKQUOTE>
<TABLE>
<TBODY>
<TR>
<TD
noWrap>collection_name(subscript) := expression;
</TD></TR></TBODY></TABLE></BLOCKQUOTE>
<P>其中expression的值和被指定的元素类型必须一致。下面我们来看三个例子。 </P>
<UL>
<LI>例一:数据的兼容性 </LI></UL>
<P>例子中的集合与集合之间互相赋值,但必须是两个集合类型相同的才可以,光是元素的类型相同是不够的。 </P>
<BLOCKQUOTE>
<TABLE>
<TBODY>
<TR>
<TD
noWrap><STRONG>DECLARE</STRONG><BR> <STRONG>TYPE</STRONG> clientele <STRONG>IS</STRONG> VARRAY(100) <STRONG>OF</STRONG> customer;<BR><BR> <STRONG>TYPE</STRONG> vips <STRONG>IS</STRONG> VARRAY(100) <STRONG>OF</STRONG> customer;<BR><BR> <EM>-- These first two variables have the same datatype.</EM><BR> group1 clientele := clientele(...);<BR> group2 clientele := clientele(...);<BR> <EM>-- This third variable has a similar declaration,</EM><BR> <EM>-- but is not the same type.</EM><BR> group3 vips := vips(...);<BR><STRONG>BEGIN</STRONG><BR> <EM>-- Allowed because they have the same datatype</EM><BR> group2 := group1;<BR> <EM>-- Not allowed because they have different datatypes</EM><BR> group3 := group2;<BR><STRONG>END</STRONG>;
</TD></TR></TBODY></TABLE></BLOCKQUOTE>
<UL>
<LI>例二:为嵌套表赋空值 </LI></UL>
<P>当我们把一个被自动初始化为空的嵌套表或变长数组赋给另外一个嵌套表或变长数组时,被赋值的集合就会被重新初始化,结果也为NULL。
</P>
<BLOCKQUOTE>
<TABLE>
<TBODY>
<TR>
<TD
noWrap><STRONG>DECLARE</STRONG><BR> <STRONG>TYPE</STRONG> clientele <STRONG>IS</STRONG> <STRONG>TABLE</STRONG> <STRONG>OF</STRONG> <STRONG>VARCHAR2</STRONG>(64);<BR><BR> <EM>-- This nested table has some values.</EM><BR> group1 clientele := clientele(<EM>'Customer 1'</EM>, <EM>'Customer 2'</EM>);<BR> <EM>-- This nested table is not initialized ("atomically null").</EM><BR> group2 clientele;<BR><STRONG>BEGIN</STRONG><BR> <EM>-- At first, the test <STRONG>IF</STRONG> group1 <STRONG>IS</STRONG> <STRONG>NULL</STRONG> yields <STRONG>FALSE</STRONG>.</EM><BR> <EM>-- Then we assign a null nested table to group1.</EM><BR> group1 := group2;<BR> <EM>-- Now the test <STRONG>IF</STRONG> group1 <STRONG>IS</STRONG> <STRONG>NULL</STRONG> yields <STRONG>TRUE</STRONG>.</EM><BR> <EM>-- We must use another constructor to give it some values.</EM><BR><STRONG>END</STRONG>;
</TD></TR></TBODY></TABLE></BLOCKQUOTE>
<UL>
<LI>例三:集合赋值时可能引起的异常 </LI></UL>
<P>在下面几种给集合元素赋值的情况下,可能会引起多种异常。</P>
<OL>
<LI>如果下标索引不存在或无法转换成正确的数据类型,PL/SQL就会抛出预定义异常VALUE_ERROR。通常,下标是一个整数。但关联数组的下标也可以是VARCHAR2类型。
<LI>如果所给下标索引指向了一个未初始化的元素时,PL/SQL就会抛出SUBSCRIPT_BEYOND_COUNT异常。
<LI>如果集合被自动初始化为空值并且程序引用了其中的一个元素,PL/SQL会抛出COLLECTION_IS_NULL异常。
</LI></OL>
<BLOCKQUOTE>
<TABLE>
<TBODY>
<TR>
<TD
noWrap><STRONG>DECLARE</STRONG><BR> <STRONG>TYPE</STRONG> wordlist <STRONG>IS</STRONG> <STRONG>TABLE</STRONG> <STRONG>OF</STRONG> <STRONG>VARCHAR2</STRONG>(5);<BR><BR> words wordlist;<BR><STRONG>BEGIN</STRONG><BR> <EM>/* Assume execution continues despite the raised exceptions. */</EM><BR> <EM>-- Raises COLLECTION_IS_NULL. We haven't used a constructor yet.</EM><BR> <EM>-- This exception applies to varrays and nested tables, but not</EM><BR> <EM>-- associative arrays which don't need a constructor.</EM><BR> words(1) := 10;<BR> <EM>-- After using a constructor, we can assign values to the elements.</EM><BR> words := wordlist(10,<BR> 20,<BR> 30<BR> );<BR> <EM>-- Any expression that returns a VARCHAR2(5) is OK.</EM><BR> words(1) := <EM>'yes'</EM>;<BR> words(2) := words(1) || <EM>'no'</EM>;<BR> <EM>-- Raises VALUE_ERROR because the assigned value is too long.</EM><BR> words(3) := <EM>'longer than 5 characters'</EM>;<BR> <EM>-- Raises VALUE_ERROR because the subscript of a nested table must</EM><BR> <EM>-- be an integer.</EM><BR> words(<EM>'B'</EM>) := <EM>'dunno'</EM>;<B
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -