📄 第五章 pl-sql集合与记录(1) - pl-sql用户指南与参考 - whatiswhat.htm
字号:
<P>标识符courses代表整张嵌套表,courses中的每个元素存放一个大学课程的代号,如"Math
1020"。 </P>
<UL>
<LI>变长数组的例子 </LI></UL>
<P>下面的脚本创建了能够存储变长数组的数据库字段,其中每个元素包含一个VARCHAR2类型值: </P>
<BLOCKQUOTE>
<TABLE>
<TBODY>
<TR>
<TD
noWrap> <EM>-- Each project has a 16-character code name.</EM><BR> <EM>-- We will store up to 50 projects at a time in a database column.</EM><BR><BR><STRONG>CREATE</STRONG> <STRONG>TYPE</STRONG> projectlist <STRONG>AS</STRONG> VARRAY(50) <STRONG>OF</STRONG> <STRONG>VARCHAR2</STRONG>(16);<BR>/<BR><BR><STRONG>CREATE</STRONG> <STRONG>TABLE</STRONG> department ( <EM>-- create database table</EM><BR> dept_id <STRONG>NUMBER</STRONG>(2),<BR> NAME <STRONG>VARCHAR2</STRONG>(15),<BR> budget <STRONG>NUMBER</STRONG>(11,2),<BR> <EM>-- Each department can have up to 50 projects.</EM><BR> projects projectlist)<BR>/
</TD></TR></TBODY></TABLE></BLOCKQUOTE>
<P class=title1>四、声明PL/SQL集合变量</P>
<P>在定义了集合类型之后,我们就可以声明该类型的变量了。在声明中要使用新的类型名称,使用方法跟使用预定义类型(如NUMBER和INTEGER等)声明的方法一样。
</P>
<UL>
<LI>例一:声明嵌套表、变长数组和关联数组 </LI></UL>
<BLOCKQUOTE>
<TABLE>
<TBODY>
<TR>
<TD
noWrap><STRONG>DECLARE</STRONG><BR> <STRONG>TYPE</STRONG> nested_type <STRONG>IS</STRONG> <STRONG>TABLE</STRONG> <STRONG>OF</STRONG> <STRONG>VARCHAR2</STRONG>(20);<BR><BR> <STRONG>TYPE</STRONG> varray_type <STRONG>IS</STRONG> VARRAY(50) <STRONG>OF</STRONG> <STRONG>INTEGER</STRONG>;<BR><BR> <STRONG>TYPE</STRONG> associative_array_type <STRONG>IS</STRONG> <STRONG>TABLE</STRONG> <STRONG>OF</STRONG> <STRONG>NUMBER</STRONG><BR> <STRONG>INDEX</STRONG> <STRONG>BY</STRONG> <STRONG>BINARY_INTEGER</STRONG>;<BR><BR> v1 nested_type;<BR> v2 varray_type;<BR> v3 associative_array_type;<BR></TD></TR></TBODY></TABLE></BLOCKQUOTE>
<UL>
<LI>例二:%TYPE </LI></UL>
<P>我们可以利用%TYPE来引用已声明过的集合类型,这样,在集合的定义发生改变时,所有依赖这个集合类型的变量也会相应地改变自己的元素个数和类型,与类型保持一致:
</P>
<BLOCKQUOTE>
<TABLE>
<TBODY>
<TR>
<TD
noWrap><STRONG>DECLARE</STRONG><BR> <STRONG>TYPE</STRONG> platoon <STRONG>IS</STRONG> VARRAY(20) <STRONG>OF</STRONG> soldier;<BR><BR> p1 platoon;<BR> <EM>-- If we change the number of soldiers in a platoon, p2 will</EM><BR> <EM>-- reflect that change when this block is recompiled.</EM><BR> p2 p1%<STRONG>TYPE</STRONG>;
</TD></TR></TBODY></TABLE></BLOCKQUOTE>
<UL>
<LI>例三:把嵌套表声明为过程参数 </LI></UL>
<P>我们可以把集合声明为函数或过程的形式参数。这样,就能把集合从一个存储子程序传递到另一个。下面例子中把嵌套表声明为打包过程的参数:</P>
<BLOCKQUOTE>
<TABLE>
<TBODY>
<TR>
<TD
noWrap><STRONG>CREATE</STRONG> <STRONG>PACKAGE</STRONG> personnel <STRONG>AS</STRONG><BR> <STRONG>TYPE</STRONG> staff <STRONG>IS</STRONG> <STRONG>TABLE</STRONG> <STRONG>OF</STRONG> employee;<BR> ...<BR> <STRONG>PROCEDURE</STRONG> award_bonuses(members <STRONG>IN</STRONG> staff);<BR><STRONG>END</STRONG> personnel;
</TD></TR></TBODY></TABLE></BLOCKQUOTE>
<P>想要从包外调用PERSONNEL.AWARD_BONUSES,我们就得声明PERSONNEL.STAFF类型的变量,然后把它作为参数传递进去。我们还可以在函数说明部分指定RETURN的类型为集合:
</P>
<BLOCKQUOTE>
<TABLE>
<TBODY>
<TR>
<TD
noWrap><STRONG>DECLARE</STRONG><BR> <STRONG>TYPE</STRONG> SalesForce <STRONG>IS</STRONG> VARRAY(25) <STRONG>OF</STRONG> Salesperson;<BR> <STRONG>FUNCTION</STRONG> top_performers (n <STRONG>INTEGER</STRONG>) <STRONG>RETURN</STRONG> SalesForce <STRONG>IS</STRONG> ...
</TD></TR></TBODY></TABLE></BLOCKQUOTE>
<UL>
<LI>例四:用%TYPE和%ROWTYPE指定集合的元素类型 </LI></UL>
<P>在指定元素的集合类型时,我们可以使用%TYPE和%ROWTYPE。示例如下: </P>
<BLOCKQUOTE>
<TABLE>
<TBODY>
<TR>
<TD
noWrap><STRONG>DECLARE</STRONG><BR> <STRONG>TYPE</STRONG> EmpList <STRONG>IS</STRONG> <STRONG>TABLE</STRONG> <STRONG>OF</STRONG> emp.ename%<STRONG>TYPE</STRONG>; <EM>-- based on column</EM><BR> <STRONG>CURSOR</STRONG> c1 <STRONG>IS</STRONG> <STRONG>SELECT</STRONG> * <STRONG>FROM</STRONG> dept;<BR> <STRONG>TYPE</STRONG> DeptFile <STRONG>IS</STRONG> VARRAY(20) <STRONG>OF</STRONG> c1%<STRONG>ROWTYPE</STRONG>; <EM>-- based on cursor</EM>
</TD></TR></TBODY></TABLE></BLOCKQUOTE>
<UL>
<LI>例五:记录类型的变长数组 </LI></UL>
<P>下面的例子中,我们使用RECORD作为元素的数据类型: </P>
<BLOCKQUOTE>
<TABLE>
<TBODY>
<TR>
<TD
noWrap><STRONG>DECLARE</STRONG><BR> <STRONG>TYPE</STRONG> anentry <STRONG>IS</STRONG> <STRONG>RECORD</STRONG>(<BR> term <STRONG>VARCHAR2</STRONG>(20),<BR> meaning <STRONG>VARCHAR2</STRONG>(200)<BR> );<BR><BR> <STRONG>TYPE</STRONG> glossary <STRONG>IS</STRONG> VARRAY(250) <STRONG>OF</STRONG> anentry;
</TD></TR></TBODY></TABLE></BLOCKQUOTE>
<UL>
<LI>例六:为集合的元素添加NOT NULL约束 </LI></UL>
<BLOCKQUOTE>
<TABLE>
<TBODY>
<TR>
<TD
noWrap><STRONG>DECLARE</STRONG><BR> <STRONG>TYPE</STRONG> EmpList <STRONG>IS</STRONG> <STRONG>TABLE</STRONG> <STRONG>OF</STRONG> emp.empno%<STRONG>TYPE</STRONG> <STRONG>NOT</STRONG> <STRONG>NULL</STRONG>;
</TD></TR></TBODY></TABLE></BLOCKQUOTE>
<P class=title1>五、初始化与引用集合</P>
<P>在我们为嵌套表和变长数组初始化之前,它们都会自动地被设置成空值。所谓的空值指的是集合本身是空,不是针对它所拥有的元素。可以使用系统定义的与集合类型同名的函数来初始化集合。
</P>
<P>我们必须显式地调用构造函数为每一个变长数组和嵌套表变量进行初始化操作(对于关联数组来说,是不需要使用构造函数进行初始化的)。
</P>
<UL>
<LI>例一:嵌套表的构造函数 </LI></UL>
<P>在下面的例子中,我们为构造函数CourseList()传递多个元素,然后构造函数就能为我们返回包含这些元素的嵌套表:
</P>
<BLOCKQUOTE>
<TABLE>
<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;<BR><STRONG>BEGIN</STRONG><BR> my_courses := courselist(<EM>'Econ 2010'</EM>,<BR> <EM>'Acct 3401'</EM>,<BR> <EM>'Mgmt 3100'</EM><BR> );<BR><STRONG>END</STRONG>;
</TD></TR></TBODY></TABLE></BLOCKQUOTE>
<P>由于嵌套表没有声明最大长度,所以我们可以在构造中可以放置任意个数的元素。 </P>
<UL>
<LI>例二:变长数组的构造函数 </LI></UL>
<BLOCKQUOTE>
<TABLE>
<TBODY>
<TR>
<TD
noWrap><STRONG>DECLARE</STRONG><BR> <STRONG>TYPE</STRONG> projectlist <STRONG>IS</STRONG> VARRAY(50) <STRONG>OF</STRONG> <STRONG>VARCHAR2</STRONG>(16);<BR><BR> accounting_projects projectlist;<BR><STRONG>BEGIN</STRONG><BR> accounting_projects := projectlist(<EM>'Expense Report'</EM>,<BR> <EM>'Outsourcing'</EM>,<BR> <EM>'Auditing'</EM><BR> );<BR><STRONG>END</STRONG>;
</TD></TR></TBODY></TABLE></BLOCKQUOTE>
<P>我们不需要初始化整个变长数组,对于一个长度为50的变长数组来说,我们只需传递一部分元素给它的构造函数即可。
</P>
<UL>
<LI>例三:包含空元素的集合构造函数 </LI></UL>
<P>如果我们没有对元素使用NOT NULL约束,那么我们就可以把空值传给构造函数: </P>
<BLOCKQUOTE>
<TABLE>
<TBODY>
<TR>
<TD
noWrap><STRONG>BEGIN</STRONG><BR> my_courses := CourseList(<EM>'Math 3010'</EM>, <STRONG>NULL</STRONG>, <EM>'Stat 3202'</EM>);
</TD></TR></TBODY></TABLE></BLOCKQUOTE>
<UL>
<LI>例四:把声明和构造结合起来 </LI></UL>
<P>我们可以在声明的时候初始化集合,这是一个很好的编程习惯: </P>
<BLOCKQUOTE>
<TABLE>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -