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

📄 第五章 pl-sql集合与记录(1) - pl-sql用户指南与参考 - whatiswhat.htm

📁 sql初学者不错的教程
💻 HTM
📖 第 1 页 / 共 5 页
字号:
                        <P>标识符courses代表整张嵌套表,courses中的每个元素存放一个大学课程的代号,如"Math 
                        1020"。 </P>
                        <UL>
                          <LI>变长数组的例子 </LI></UL>
                        <P>下面的脚本创建了能够存储变长数组的数据库字段,其中每个元素包含一个VARCHAR2类型值: </P>
                        <BLOCKQUOTE>
                          <TABLE>
                            <TBODY>
                            <TR>
                              <TD 
                                noWrap>&nbsp;<EM>--&nbsp;Each&nbsp;project&nbsp;has&nbsp;a&nbsp;16-character&nbsp;code&nbsp;name.</EM><BR>&nbsp;<EM>--&nbsp;We&nbsp;will&nbsp;store&nbsp;up&nbsp;to&nbsp;50&nbsp;projects&nbsp;at&nbsp;a&nbsp;time&nbsp;in&nbsp;a&nbsp;database&nbsp;column.</EM><BR><BR><STRONG>CREATE</STRONG>&nbsp;<STRONG>TYPE</STRONG>&nbsp;projectlist&nbsp;<STRONG>AS</STRONG>&nbsp;VARRAY(50)&nbsp;<STRONG>OF</STRONG>&nbsp;<STRONG>VARCHAR2</STRONG>(16);<BR>/<BR><BR><STRONG>CREATE</STRONG>&nbsp;&nbsp;<STRONG>TABLE</STRONG>&nbsp;department&nbsp;(&nbsp;&nbsp;&nbsp;<EM>--&nbsp;create&nbsp;database&nbsp;table</EM><BR>&nbsp;&nbsp;&nbsp;&nbsp;dept_id&nbsp;<STRONG>NUMBER</STRONG>(2),<BR>&nbsp;&nbsp;&nbsp;&nbsp;NAME&nbsp;<STRONG>VARCHAR2</STRONG>(15),<BR>&nbsp;&nbsp;&nbsp;&nbsp;budget&nbsp;<STRONG>NUMBER</STRONG>(11,2),<BR>&nbsp;&nbsp;&nbsp;&nbsp;<EM>--&nbsp;Each&nbsp;department&nbsp;can&nbsp;have&nbsp;up&nbsp;to&nbsp;50&nbsp;projects.</EM><BR>&nbsp;&nbsp;&nbsp;&nbsp;projects&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;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>&nbsp;&nbsp;<STRONG>TYPE</STRONG>&nbsp;nested_type&nbsp;<STRONG>IS</STRONG>&nbsp;<STRONG>TABLE</STRONG>&nbsp;<STRONG>OF</STRONG>&nbsp;<STRONG>VARCHAR2</STRONG>(20);<BR><BR>&nbsp;&nbsp;<STRONG>TYPE</STRONG>&nbsp;varray_type&nbsp;<STRONG>IS</STRONG>&nbsp;VARRAY(50)&nbsp;<STRONG>OF</STRONG>&nbsp;<STRONG>INTEGER</STRONG>;<BR><BR>&nbsp;&nbsp;<STRONG>TYPE</STRONG>&nbsp;associative_array_type&nbsp;<STRONG>IS</STRONG>&nbsp;<STRONG>TABLE</STRONG>&nbsp;<STRONG>OF</STRONG>&nbsp;<STRONG>NUMBER</STRONG><BR>&nbsp;&nbsp;&nbsp;&nbsp;<STRONG>INDEX</STRONG>&nbsp;<STRONG>BY</STRONG>&nbsp;<STRONG>BINARY_INTEGER</STRONG>;<BR><BR>&nbsp;&nbsp;v1&nbsp;&nbsp;&nbsp;nested_type;<BR>&nbsp;&nbsp;v2&nbsp;&nbsp;&nbsp;varray_type;<BR>&nbsp;&nbsp;v3&nbsp;&nbsp;&nbsp;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>&nbsp;&nbsp;<STRONG>TYPE</STRONG>&nbsp;platoon&nbsp;<STRONG>IS</STRONG>&nbsp;VARRAY(20)&nbsp;<STRONG>OF</STRONG>&nbsp;soldier;<BR><BR>&nbsp;&nbsp;p1&nbsp;&nbsp;&nbsp;platoon;<BR>&nbsp;&nbsp;<EM>--&nbsp;If&nbsp;we&nbsp;change&nbsp;the&nbsp;number&nbsp;of&nbsp;soldiers&nbsp;in&nbsp;a&nbsp;platoon,&nbsp;p2&nbsp;will</EM><BR>&nbsp;&nbsp;<EM>--&nbsp;reflect&nbsp;that&nbsp;change&nbsp;when&nbsp;this&nbsp;block&nbsp;is&nbsp;recompiled.</EM><BR>&nbsp;&nbsp;p2&nbsp;&nbsp;&nbsp;p1%<STRONG>TYPE</STRONG>; 
                              </TD></TR></TBODY></TABLE></BLOCKQUOTE>
                        <UL>
                          <LI>例三:把嵌套表声明为过程参数 </LI></UL>
                        <P>我们可以把集合声明为函数或过程的形式参数。这样,就能把集合从一个存储子程序传递到另一个。下面例子中把嵌套表声明为打包过程的参数:</P>
                        <BLOCKQUOTE>
                          <TABLE>
                            <TBODY>
                            <TR>
                              <TD 
                                noWrap><STRONG>CREATE</STRONG>&nbsp;<STRONG>PACKAGE</STRONG>&nbsp;personnel&nbsp;<STRONG>AS</STRONG><BR>&nbsp;&nbsp;<STRONG>TYPE</STRONG>&nbsp;staff&nbsp;<STRONG>IS</STRONG>&nbsp;<STRONG>TABLE</STRONG>&nbsp;<STRONG>OF</STRONG>&nbsp;employee;<BR>&nbsp;&nbsp;...<BR>&nbsp;&nbsp;<STRONG>PROCEDURE</STRONG>&nbsp;award_bonuses(members&nbsp;<STRONG>IN</STRONG>&nbsp;staff);<BR><STRONG>END</STRONG>&nbsp;personnel; 
                              </TD></TR></TBODY></TABLE></BLOCKQUOTE>
                        <P>想要从包外调用PERSONNEL.AWARD_BONUSES,我们就得声明PERSONNEL.STAFF类型的变量,然后把它作为参数传递进去。我们还可以在函数说明部分指定RETURN的类型为集合: 
                        </P>
                        <BLOCKQUOTE>
                          <TABLE>
                            <TBODY>
                            <TR>
                              <TD 
                                noWrap><STRONG>DECLARE</STRONG><BR>&nbsp;&nbsp;<STRONG>TYPE</STRONG>&nbsp;SalesForce&nbsp;<STRONG>IS</STRONG>&nbsp;VARRAY(25)&nbsp;<STRONG>OF</STRONG>&nbsp;Salesperson;<BR>&nbsp;&nbsp;<STRONG>FUNCTION</STRONG>&nbsp;top_performers&nbsp;(n&nbsp;<STRONG>INTEGER</STRONG>)&nbsp;<STRONG>RETURN</STRONG>&nbsp;SalesForce&nbsp;<STRONG>IS</STRONG>&nbsp;... 
                              </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>&nbsp;&nbsp;<STRONG>TYPE</STRONG>&nbsp;EmpList&nbsp;<STRONG>IS</STRONG>&nbsp;<STRONG>TABLE</STRONG>&nbsp;<STRONG>OF</STRONG>&nbsp;emp.ename%<STRONG>TYPE</STRONG>;&nbsp;&nbsp;&nbsp;<EM>--&nbsp;based&nbsp;on&nbsp;column</EM><BR>&nbsp;&nbsp;<STRONG>CURSOR</STRONG>&nbsp;c1&nbsp;<STRONG>IS</STRONG>&nbsp;<STRONG>SELECT</STRONG>&nbsp;*&nbsp;<STRONG>FROM</STRONG>&nbsp;dept;<BR>&nbsp;&nbsp;<STRONG>TYPE</STRONG>&nbsp;DeptFile&nbsp;<STRONG>IS</STRONG>&nbsp;VARRAY(20)&nbsp;<STRONG>OF</STRONG>&nbsp;c1%<STRONG>ROWTYPE</STRONG>;&nbsp;&nbsp;&nbsp;<EM>--&nbsp;based&nbsp;on&nbsp;cursor</EM> 
                              </TD></TR></TBODY></TABLE></BLOCKQUOTE>
                        <UL>
                          <LI>例五:记录类型的变长数组 </LI></UL>
                        <P>下面的例子中,我们使用RECORD作为元素的数据类型: </P>
                        <BLOCKQUOTE>
                          <TABLE>
                            <TBODY>
                            <TR>
                              <TD 
                                noWrap><STRONG>DECLARE</STRONG><BR>&nbsp;&nbsp;<STRONG>TYPE</STRONG>&nbsp;anentry&nbsp;<STRONG>IS</STRONG>&nbsp;<STRONG>RECORD</STRONG>(<BR>&nbsp;&nbsp;&nbsp;&nbsp;term&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<STRONG>VARCHAR2</STRONG>(20),<BR>&nbsp;&nbsp;&nbsp;&nbsp;meaning&nbsp;&nbsp;&nbsp;<STRONG>VARCHAR2</STRONG>(200)<BR>&nbsp;&nbsp;);<BR><BR>&nbsp;&nbsp;<STRONG>TYPE</STRONG>&nbsp;glossary&nbsp;<STRONG>IS</STRONG>&nbsp;VARRAY(250)&nbsp;<STRONG>OF</STRONG>&nbsp;anentry; 
                              </TD></TR></TBODY></TABLE></BLOCKQUOTE>
                        <UL>
                          <LI>例六:为集合的元素添加NOT NULL约束 </LI></UL>
                        <BLOCKQUOTE>
                          <TABLE>
                            <TBODY>
                            <TR>
                              <TD 
                                noWrap><STRONG>DECLARE</STRONG><BR>&nbsp;&nbsp;<STRONG>TYPE</STRONG>&nbsp;EmpList&nbsp;<STRONG>IS</STRONG>&nbsp;<STRONG>TABLE</STRONG>&nbsp;<STRONG>OF</STRONG>&nbsp;emp.empno%<STRONG>TYPE</STRONG>&nbsp;<STRONG>NOT</STRONG>&nbsp;<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>&nbsp;&nbsp;<STRONG>TYPE</STRONG>&nbsp;courselist&nbsp;<STRONG>IS</STRONG>&nbsp;<STRONG>TABLE</STRONG>&nbsp;<STRONG>OF</STRONG>&nbsp;<STRONG>VARCHAR2</STRONG>(16);<BR><BR>&nbsp;&nbsp;my_courses&nbsp;&nbsp;&nbsp;courselist;<BR><STRONG>BEGIN</STRONG><BR>&nbsp;&nbsp;my_courses&nbsp;&nbsp;&nbsp;&nbsp;:=&nbsp;courselist(<EM>'Econ&nbsp;2010'</EM>,<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<EM>'Acct&nbsp;3401'</EM>,<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<EM>'Mgmt&nbsp;3100'</EM><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;);<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>&nbsp;&nbsp;<STRONG>TYPE</STRONG>&nbsp;projectlist&nbsp;<STRONG>IS</STRONG>&nbsp;VARRAY(50)&nbsp;<STRONG>OF</STRONG>&nbsp;<STRONG>VARCHAR2</STRONG>(16);<BR><BR>&nbsp;&nbsp;accounting_projects&nbsp;&nbsp;&nbsp;projectlist;<BR><STRONG>BEGIN</STRONG><BR>&nbsp;&nbsp;accounting_projects&nbsp;&nbsp;&nbsp;&nbsp;:=&nbsp;projectlist(<EM>'Expense&nbsp;Report'</EM>,<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<EM>'Outsourcing'</EM>,<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<EM>'Auditing'</EM><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;);<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>&nbsp;&nbsp;my_courses&nbsp;:=&nbsp;CourseList(<EM>'Math&nbsp;3010'</EM>,&nbsp;<STRONG>NULL</STRONG>,&nbsp;<EM>'Stat&nbsp;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 + -