




已阅读5页,还剩25页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第五章 PLSQL集合与记录(1) PLSQL用户指南与参考 第五章PL/SQL集合与记录 (1)第五章PL/SQL集合与记录 一、什么是集合集合就是相同类型的元素的有序合集。 它一个通用的概念,其中包含了列表、数组和其他相似的数据类型。 每一个元素都有唯一的下标来标识当前元素在集合中的位置。 PL/SQL提供了以下几种集合类型1.索引表,也称为关联数组,可以让我们使用数字或字符串作下标来查找元素。 (这有点和其他语言中的哈希表相类似。 )2.嵌套表可以容纳任意个数的元素,使用有序数字作下标。 我们可以定义等价的SQL类型,把嵌套表存到数据库中去,并通过SQL语句进行操作。 3.变长数组能保存固定数量的元素(但可以在运行时改变它的大小),使用有序数字作为下标。 同嵌套表一样,也可以保存到数据库中去,但灵活性不如嵌套表好。 虽热集合是一维的,但我们可以把一个集合作为另外一个集合的元素来建立多维集合。 要在应用程序中使用集合,我们要先定义一个或多个PL/SQL类型,然后声明这些类型的变量。 我们可以在过程、函数或包中定义集合类型。 还可以把集合作为参数在客户端和存储子程序之间传递数据。 要查找复杂类型的数据,我们可以在集合中存放PL/SQL记录或SQL对象类型。 嵌套表和变长数组也可以作为对象类型的属性。 1、理解嵌套表在数据库中,嵌套表可以被当作单列的数据表来使用。 Oracle在往嵌套表中存放数据时是没有特定顺序的。 但是,当我们把检索出来的数据存放在PL/SQL变量时,所有行的下标就会从1开始顺序编号。 这样,就能像访问数组那样访问每一行数据。 嵌套表有两个重要的地方不同于数组1.数组有固定的上限,而嵌套表是没有上界的。 所以,嵌套表的大小是可以动态增长的。 如下图2.数组必须是密集的(dense),有着连续的下标索引。 所以我们不能从数组中删除元素。 而对于嵌套表来说,初始化时,它是密集的,但它是允许有间隙的(sparse),也就是说它的下标索引可以是不连续的。 所以我们可以使用内置过程DELETE从嵌套表中删除元素。 这样做会在下标索引上留下空白,但内置函数NEXT仍能让我们遍历连续地访问所有下标。 2、理解变长数组VARRAY被称为变长数组。 它允许我们使用一个独立的标识来确定整个集合。 这种关联能让我们把集合作为一个整体来操作,并很容易地引用其中每一个元素。 下面是一个变长数组的例子,如果我们要引用第三个元素的话,就可以使用Grade (3)。 变长数组有一个长度最大值,是在我们定义时指定的。 它的索引有一个固定的下界1和一个可扩展的上界。 例如变长数组Grades当前上界是7,但我们可以把它扩展到 8、 9、10等等。 因此,一个变长数组能容纳不定个数的元素,从零(空的时候)到类型定义时所指定的最大长度。 3、理解关联数组(索引表)关联数组就是键值对的集合,其中键是唯一的,用于确定数组中对应的值。 键可以是整数或字符串。 第一次使用键来指派一个对应的值就是添加元素,而后续这样的操作就是更新元素。 下面的例子演示了如何使用关联数组DECLARE TYPEpopulation_type IS TABLE OFNUMBER INDEX BY VARCHAR2 (64);country_population population_type;continent_population population_type;howmany NUMBER;which VARCHAR2 (64);BEGIN country_population(Greenland):=100000;country_population(Iceland):=750000;howmany:=country_population(Greenland);continent_population(Australia):=30000000;continent_population(Antarctica):=1000;-Creates newentry continent_population(Antarctica):=1001;-Replaces previousvalue which:=continent_population.FIRST;-ReturnsAntarctica-as thates firstalphabetically.which:=continent_population.LAST;-ReturnsAustraliahowmany:=continent_population(continent_population.LAST);-Returns thevalue correspondingto thelast key,in this-case thepopulation ofAustralia.END;/关联数组能帮我们存放任意大小的数据集合,快速查找数组中的元素。 它像一个简单的SQL表,可以按主键来检索数据。 因为关联数组的作用是存放临时数据,所以不能对它应用像INSERT和SELECT INTO这样的SQL语句。 4、全球化设置对使用VARCHAR2类型作主键的关联数组的影响如果在使用VARCHAR2作为键的关联数组的会话中改变国家语言或全球化设置,就有可能引起一个运行时异常。 例如,在一个会话中改变初始化参数NLS_P或NLS_SORT的值后,再调用NEXT和PRIOR就可能会引起异常。 如果我们必须在会话中更改这些设置的话,那么,在重新使用关联数组的相关操作之前,就必须确保参数值被改回原值。 在用字符串作为关联数组的键的时候,声明时必须使用VARCHAR 2、STRING或LONG类型,但使用的时候可以使用其他类型,如NVARCHAR2,VARCHAR2等,甚至是DATE,这些类型值都会被TO_CHAR函数转成VARCHAR2。 但是,在使用其他类型作为键的时候一定要慎重。 这里举几个例子当初始化参数NLS_DATE_FORMAT发生改变时,函数SYSDATE转成字符串的值就可能发生改变,这样的话,array_element(SYSDATE)的结果就和先前的结果不一样了;两个不同的NVARCHAR2类型值转成VARCHAR2值之后可能得出的结果是相同的,这样,数组array_element(national_string1)和array_element(national_string2)可能引用同一个元素。 当我们使用数据库连接(database link)把关联数组作为参数传递给远程数据库时,如果两个数据库的全球化设置不一致,远程数据库会使用自己的字符顺序来调用FIRST和NEXT操作,即使该顺序与原集合顺序不同。 由于字符集的不同,就可能出现在一个数据库中两个不同的键在另一个数据库被当作同一个键处理的情况,这时程序就会收到一个VALUE_ERROR异常。 二、集合类型的选择如果我们有用其他语言编写的代码或业务逻辑,通常可以把其中的数组或集合直接转成PL/SQL的集合类型。 1.其他语言中的数组可以转成PL/SQL中的VARRAY。 2.其他语言中的集合和包(bags)可以转成PL/SQL中的嵌套表。 3.哈希表和其他无序查找表(unordered lookuptable)可以转成PL/SQL中的关联数组。 当编写原始代码或从头开始设计业务逻辑的时候,我们应该考虑每种类型的优势,然后决定使用哪个类型更加合适。 1、嵌套表与关联数组间的选择嵌套表和关联数组(原来称为索引表)都使用相似的下标标志,但它们在持久化和参数传递上有些不同的特性。 嵌套表可以保存到数据表字段中,而关联数组不可以。 嵌套表适于存放能够被持久化的重要数据。 关联数组适用于存放较小量的数据,每次调用过程或包初始化时在内存中构建出来。 它能够保存容量不固定的信息,因为它的长度大小是可变的。 关联数组的索引值很灵活,可以是负数,不连续的数字,适当的时候还可以使用字符串代替数字。 PL/SQL能自动地将使用数字作为键的关联数组和主数组(host array)进行转换。 集合和数据库服务器间数据传输的最有效的方法就是使用匿名PL/SQL块进行批量绑定数据绑定。 2、嵌套表与变长数组间的选择在数据个数能够预先确定的情况下,使用变长数组是一个很好的选择。 在存入数据库的时候,变长数组会保持它们原有的顺序和下标。 无论在表内(变长数组大小不到4k)还是在表外(变长数组大小超过4k),每个变长数组都被作为独立的一个对象对待。 我们必须对变长数组中的所有元素进行一次性检索或更新。 但对于较大量的数据来说,变长数组就不太适用了。 嵌套表是可以有间隙的我们可以任意地删除元素,不必非得从末端开始。 嵌套表数据是存放在系统生成的数据表中,这就使嵌套表适合查询和更新集合中的部分元素。 我们不能依赖于元素在嵌套表中的顺序和下标,因为这些顺序和下标在嵌套表存到数据库时并不能被保持。 三、定义集合类型要使用集合,我们首先要创建集合类型,然后声明该类型的变量。 我们可以在任何PL/SQL块、子程序或包的声明部分使用TABLE和VARRAY类型。 集合的作用域和初始化规则同其他类型和变量一样。 在一个块或子程序中,当程序进入块或子程序时集合被初始化,退出时销毁。 在包中,集合在我们第一次引用包的时候初始化,直至会话终止时才销毁。 ?嵌套表对于嵌套表,可以使用下面的语法来进行定义TYPE type_name IS TABLE OF element_typeNOT NULL;其中type_name是在集合声明使用的类型标识符,而element_type可以是除了REF CURSOR类型之外的任何PL/SQL类型。 对于使用SQL声明的全局嵌套表来说,它的元素类型受到一些额外的限制。 以下几种类型是不可以使用的1.BINARY_INTEGER,PLS_INTEGER2.BOOLEAN3.LONG,LONG RAW4.NATURAL,NATURALN5.POSITIVE,POSITIVEN6.REF CURSOR7.SIGNTYPE8.STRING?变长数组对于变长数组类型,可以使用下面的语法进行定义TYPE type_name ISVARRAY|VARYING ARRAY(size_limit)OFelement_typeNOT NULL;type_name和element_type的含义与嵌套表相同。 size_limit是正整数,代表数组中最多允许存放元素的个数。 在定义VARRAY时,我们必须指定它的长度最大值。 下例中,我们定义了一个存储366个DATE类型的VARRAYDECLARE TYPECalendar IS VARRAY (366)OF DATE;?关联数组对于关联数组,可以使用下面的语法进行定义TYPE type_name IS TABLE OFelement_typeNOT NULLINDEX BYBINARY_INTEGER|PLS_INTEGER|VARCHAR2(size_limit);INDEX BYkey_type;key_type可以是BINARY_INTEGER或PLS_INTEGER,也可以是VARCHAR2或是它的子类型VARCHAR、STRING或LONG。 在用VARCHAR2做键的时候,我们必须指定VARCHAR2的长度,但这里不包括LONG类型,因为LONG等价于VARCHAR2 (32760)。 而RAW、LONG RAW、ROWID、CHAR和CHARACTER都是不允许作为关联数组的键的。 在引用一个使用VARCHAR2类型作为键的关联数组中的元素时,我们还可以使用其他类型,如DATE或TIMESTAMP,因为它们自动地会被TO_CHAR函数转换成VARCHAR2。 索引表可以使用不连续的键作下标索引。 如下例中,索引表的下标是7468而不是1DECLARE TYPEemptabtyp IS TABLE OFemp%ROWTYPE INDEX BY BINARY_INTEGER;emp_tab emptabtyp;BEGIN/*Retrieve employeerecord.*/SELECT*INTO emp_tab (7468)FROM empWHERE empno=7468;END; 1、定义与PL/SQL集合类型等价的SQL类型要把嵌套表或变长数组存到数据表中,我们必须用CREATE TYPE来创建SQL类型。 SQL类型可以当作数据表的字段或是SQL对象类型的属性来使用。 我们可以在PL/SQL中声明与之等价的类型,或在PL/SQL变量声明时直接使用SQL类型名。 ?嵌套表的例子下面的SQL*Plus脚本演示了如何在SQL中创建嵌套表,并把它作为对象类型的属性来使用CREATE TYPECourseList ASTABLE OF VARCHAR2 (10)-define type/CREATE TYPEStudent ASOBJECT(-create objectid_num INTEGER (4),name VARCHAR2 (25),address VARCHAR2 (35),status CHAR (2),courses CourseList)-declare nested table asattribute/标识符courses代表整张嵌套表,courses中的每个元素存放一个大学课程的代号,如Math1020。 ?变长数组的例子下面的脚本创建了能够存储变长数组的数据库字段,其中每个元素包含一个VARCHAR2类型值-Each projecthas a16-character codename.-We willstore up to50projects ata timein adatabase column.CREATE TYPEprojectlist ASVARRAY (50)OF VARCHAR2 (16);/CREATE TABLEdepartment(-create databasetable dept_id NUMBER (2),NAME VARCHAR2 (15),budget NUMBER(11,2),-Each departmentcan jects projectlist)/ 四、声明PL/SQL集合变量在定义了集合类型之后,我们就可以声明该类型的变量了。 在声明中要使用新的类型名称,使用方法跟使用预定义类型(如NUMBER和INTEGER等)声明的方法一样。 ?例一声明嵌套表、变长数组和关联数组DECLARE TYPEnested_type IS TABLE OF VARCHAR2 (20);TYPE varray_type IS VARRAY (50)OF INTEGER;TYPE associative_array_type IS TABLE OFNUMBER INDEX BY BINARY_INTEGER;v1nested_type;v2varray_type;v3associative_array_type;?例二%TYPE我们可以利用%TYPE来引用已声明过的集合类型,这样,在集合的定义发生改变时,所有依赖这个集合类型的变量也会相应地改变自己的元素个数和类型,与类型保持一致DECLARE TYPEplatoon IS VARRAY (20)OF soldier;p1platoon;-If wechange thenumber ofsoldiers ina platoon,p2will-reflect thatchange whenthis blockis repiled.p2p1%TYPE;?例三把嵌套表声明为过程参数我们可以把集合声明为函数或过程的形式参数。 这样,就能把集合从一个存储子程序传递到另一个。 下面例子中把嵌套表声明为打包过程的参数CREATE PACKAGEpersonnel ASTYPE staff IS TABLE OF employee;.PROCEDURE award_bonuses(members INstaff);END personnel;想要从包外调用PERSONNEL.AWARD_BONUSES,我们就得声明PERSONNEL.STAFF类型的变量,然后把它作为参数传递进去。 我们还可以在函数说明部分指定RETURN的类型为集合DECLARE TYPESalesForce IS VARRAY (25)OF Salesperson;FUNCTION top_performers(n INTEGER)RETURN SalesForceIS.?例四用%TYPE和%ROWTYPE指定集合的元素类型在指定元素的集合类型时,我们可以使用%TYPE和%ROWTYPE。 示例如下DECLARE TYPEEmpList ISTABLE OFemp.ename%TYPE;-based oncolumn CURSORc1IS SELECT*FROM dept;TYPE DeptFileIS VARRAY (20)OF c1%ROWTYPE;-based oncursor?例五记录类型的变长数组下面的例子中,我们使用RECORD作为元素的数据类型DECLARE TYPEanentry ISRECORD(term VARCHAR2 (20),meaning VARCHAR2 (200);TYPE glossaryIS VARRAY (250)OF anentry;?例六为集合的元素添加NOT NULL约束DECLARE TYPEEmpList ISTABLE OFemp.empno%TYPE NOT NULL; 五、初始化与引用集合在我们为嵌套表和变长数组初始化之前,它们都会自动地被设置成空值。 所谓的空值指的是集合本身是空,不是针对它所拥有的元素。 可以使用系统定义的与集合类型同名的函数来初始化集合。 我们必须显式地调用构造函数为每一个变长数组和嵌套表变量进行初始化操作(对于关联数组来说,是不需要使用构造函数进行初始化的)。 ?例一嵌套表的构造函数在下面的例子中,我们为构造函数CourseList()传递多个元素,然后构造函数就能为我们返回包含这些元素的嵌套表DECLARE TYPEcourselist ISTABLE OF VARCHAR2 (16);my_courses courselist;BEGIN my_courses:=courselist(Econxx,At3401,Mgmt3100);END;由于嵌套表没有声明最大长度,所以我们可以在构造中可以放置任意个数的元素。 ?例二变长数组的构造函数DECLARE TYPEprojectlist IS VARRAY (50)OFVARCHAR2 (16);aounting_projects projectlist;BEGIN aounting_projects:=projectlist(Expense Report,Outsourcing,Auditing);END;我们不需要初始化整个变长数组,对于一个长度为50的变长数组来说,我们只需传递一部分元素给它的构造函数即可。 ?例三包含空元素的集合构造函数如果我们没有对元素使用NOT NULL约束,那么我们就可以把空值传给构造函数BEGIN my_courses:=CourseList(Math3010,NULL,Stat3202);?例四把声明和构造结合起来我们可以在声明的时候初始化集合,这是一个很好的编程习惯DECLARE TYPEcourselist ISTABLE OFVARCHAR2 (16);my_courses courselist:=courselist(Art1111,Hist3100,Englxx);?例五空的(empty)变长数组构造函数如果在调用构造函数时不传递任何参数,就会得到一个空的(empty)集合,这里指的是集合内容为空,而不是集合本身为空DECLARE TYPEclientele ISVARRAY (100)OF customer;vips clientele:=clientele();-initialize emptyvarray BEGINIF vipsIS NOT NULL THEN-condition yields TRUE.END IF;END;这种情况下,我们可以调用EXTEND方法来添加元素。 ?例六SQL语句中使用嵌套表构造函数下例中,我们把几个标量值和一个CourseList嵌套表插入到表SOPHOMORES中BEGIN INSERT INTO sophomoresVALUES(5035,Ja Alvarez,122Broad St,FT,courselist(Econxx,At3401,Mgmt3100);?例七SQL语句中使用变长数组构造函数下例中,我们把一行数据插入到表DEPARTMENT。 变长数组构造函数ProjectList()为字段PROJECTS提供数据BEGIN INSERT INTO department VALUES(60,Security,750400,projectlist(New Badges,Track Computers,Check Exits); 1、引用集合中的元素集合的引用包含了集合的名称和用圆括号夹起来的下标索引。 下标索引决定了要选取哪个元素。 语法如下collection_name(subscript)多数情况下,下标是一个运算结果为整数的表达式,对于使用字符串作键的关联数组来说也可能是一个VARCHAR2类型值。 下标索引允许的范围如下1.对于嵌套表,索引值的范围在1至2*31之间。 2.对于变长数组,索引值的范围在1至最大长度之间,最大长度是在声明时指定的。 3.对于使用数字作键的关联数组来说,索引值的范围在-2*31至2*31之间。 4.对于使用字符串作键的关联数组来说,键的长度和可用值的数量要依赖于类型声明时对VARCHAR2的长度限制和数据库字符集。 ?例一使用下标索引来引用嵌套表中的元素这里我们演示一下如何引用嵌套表NAMES中的元素DECLARE TYPEroster ISTABLE OFVARCHAR2 (15);names roster:=roster(J Hamil,D Caruso,R Singh);BEGIN FOR i INnames.FIRST.names.LAST LOOPIF names(i)=J HamilTHEN NULL;END IF;END LOOP;END;?例二把嵌套表元素作为参数传递这个例子中我们在调用子程序时引用了集合中的元素DECLARE TYPEroster ISTABLE OFVARCHAR2 (15);names roster:=roster(J Hamil,D Piro,R Singh);i BINARY_INTEGER:=2;BEGIN verify_name(names(i);-call procedureEND; 六、集合的赋值集合可以用INSERT、UPDATE、FETCH或SELECT语句来赋值,也可以用赋值语句或调用子程序来赋值。 我们可以使用下面的语法来为某个指定的集合元素进行赋值collection_name(subscript):=expression;其中expression的值和被指定的元素类型必须一致。 下面我们来看三个例子。 ?例一数据的兼容性例子中的集合与集合之间互相赋值,但必须是两个集合类型相同的才可以,光是元素的类型相同是不够的。 DECLARE TYPEclientele ISVARRAY (100)OF customer;TYPE vipsISVARRAY (100)OF customer;-These firsttwo variableshave the same datatype.group1clientele:=clientele(.);group2clientele:=clientele(.);-This thirdvariable hasa similardeclaration,-but isnot thesame type.group3vips:=vips(.);BEGIN-Allowed because they havethesamedatatype group2:=group1;-Not allowedbecausetheyhave differentdatatypes group3:=group2;END;?例二为嵌套表赋空值当我们把一个被自动初始化为空的嵌套表或变长数组赋给另外一个嵌套表或变长数组时,被赋值的集合就会被重新初始化,结果也为NULL。 DECLARE TYPEclientele ISTABLE OFVARCHAR2 (64);-This nested table hassome values.group1clientele:=clientele(Customer1,Customer2);-This nested table isnot initialized(atomically null).group2clientele;BEGIN-At first,the test IF group1IS NULLyields FALSE.-Then weassign anull nestedtable togroup1.group1:=group2;-Now thetestIF group1IS NULLyieldsTRUE.-We mustuse anotherconstructor togive itsome values.END;?例三集合赋值时可能引起的异常在下面几种给集合元素赋值的情况下,可能会引起多种异常。 1.如果下标索引不存在或无法转换成正确的数据类型,PL/SQL就会抛出预定义异常VALUE_ERROR。 通常,下标是一个整数。 但关联数组的下标也可以是VARCHAR2类型。 2.如果所给下标索引指向了一个未初始化的元素时,PL/SQL就会抛出SUBSCRIPT_BEYOND_COUNT异常。 3.如果集合被自动初始化为空值并且程序引用了其中的一个元素,PL/SQL会抛出COLLECTION_IS_NULL异常。 DECLARE TYPEwordlist ISTABLE OFVARCHAR2 (5);words wordlist;BEGIN/*Assume executioncontinues despitethe raisedexceptions.*/-Raises COLLECTION_IS_NULL.We havent useda constructoryet.-This exceptionapplies to varrays andnested tables,but not-associative arrayswhich dont needa constructor.words (1):=10;-After usinga constructor,we canassign valuesto theelements.words:=wordlist(10,20,30);-Any expressionthat returnsa VARCHAR2 (5)is OK.words (1):=yes;words (2):=words (1)|no;-Raises VALUE_ERROR becausethe assignedvalue istoo long.words (3):=longer than5characters;-Raises VALUE_ERROR becausethe subscriptof anestedtablemust-be aninteger.words(B):=dunno;-Raises SUBSCRIPT_BEYOND_COUNT becausewe onlymade3elements-in theconstructor.To add new ones,we mustcall theEXTEND-method first.words (4):=maybe;END; 七、比较集合我们可以检查一个集合是不是空,但不能判断两个集合是不是相同。 像大于、小于这样的操作都是不允许使用的。 ?例一检查集合是否为空嵌套表和变长数组都能被自动初始化为空值,所以它们可以做判空操作DECLARE TYPEstaffISTABLE OFemployee;members staff;BEGIN-Condition yieldsTRUE becausewe havent useda constructor.IF membersIS NULLTHEN.END;?例二比较两个集合集合不能直接进行等或不等的比较。 例如下面的IF条件表达式就是不允许的。 DECLARE TYPEclientele ISTABLE OFVARCHAR2 (64);group1clientele:=clientele(Customer1,Customer2);group2clientele:=clientele(Customer1,Customer3);BEGIN-Equality testcauses pilationerror.IFgroup1=group2THEN.END IF;END;这个约束也适用于隐式的比较。 所以,集合不能出现在DISTINCT、GROUP BY或ORDER BY中。 如果我们想对集合进行比较的话,就得自定义等于、小于、大于比较规则。 同时还要编写一个或多个函数来检查集合和它们的元素并返回真假值。 八、在SQL语句中使用PL/SQL的集合类型集合允许我们用PL/SQL来操作复杂的数据类型。 我们的程序能计算下标索引值,并在内存中处理指定的元素,然后用SQL语句把结果保存到数据库中。 1、关于嵌套表的例子?例一创建与PL/SQL嵌套表对应的SQL类型在SQL*Plus中,我们可以创建与PL/SQL嵌套表和变长数组相对应的SQL类型SQLCREATE TYPECourseList ASTABLEOFVARCHAR2 (64);我们可以把这些类型当作数据库字段来使用SQLCREATE TABLEdepartment(2name VARCHAR2 (20),3director VARCHAR2 (20),4office VARCHAR2 (20),5courses CourseList)6NESTED TABLEcourses STOREAS courses_tab;字段COURSES中的每一个值都是一个嵌套表类型,能够保存系(department)所提供的课程。 ?例二向数据库中插入嵌套表现在,我们可以数据表填充了。 嵌套表的构造函数为字段COURSES提供了值BEGIN INSERT INTO department VALUES(English,Lynn Saunders,Breakstone Hall205,courselist(Expository Writing,Film andLiterature,Modern ScienceFiction,Discursive Writing,Modern EnglishGrammar,Introduction toShakespeare,Modern Drama,The ShortStory,The AmericanNovel);END;?例三从数据库中检索嵌套表我们可以把英语系所提供的所有课程放到PL/SQL嵌套表中DECLARE english_courses CourseList;BEGIN SELECT courses INTOenglish_courses FROM department WHEREname=English;END;在PL/SQL中,我们可以循环遍历嵌套表的元素并使用TRIM或EXTEND方法来更新嵌套表中部分或全部的元素。 然后,在把更新后的结果保存到数据库中去。 ?例四用嵌套表更新数据库中我们可以修改英语系所提供的课程列表DECLARE new_courses courselist:=courselist(Expository Writing,Film andLiterature,Discursive Writing,Modern EnglishGrammar,Realism andNaturalism,Introduction toShakespeare,Modern Drama,The ShortStory,The AmericanNovel,20th-Century Poetry,Advanced Workshopin Poetry);BEGIN UPDATE department SETcourses=new_courses WHERE NAME=English;END; 2、变长数组的一些例子假设我们在SQL*Plus中定义了对象类型Project SQLCREATE TYPEProject ASOBJECT(2project_no NUMBER (2),3title VARCHAR2 (35),4cost NUMBER(7,2);下一步,定义VARRAY类型的ProjectList,用来存放Project对象SQLCREATE TYPEProjectList ASVARRAY (50)OF Project;最后,创建关系表department,其中的一个字段类型为ProjectListSQLCREATE TABLEdepartment(2dept_id NUMBER (2),3name VARCHAR2 (15),4budget NUMBER(11,2),5projects ProjectList);在字段projects中的每一项都是一个用于存放给定系的项目计划的变长数组。 现在让我们准备插入一些测试数据。 注意一下,在下面的例子中,变长数组的构造函数ProjectList()是如何为字段projects提供数据的BEGIN INSERTINTO departmentVALUES(30,Aounting,1205700,projectlist(project(1,Design NewExpense Report,3250),project(2,Outsource Payroll,12350),project(3,Evaluate MergerProposal,2750),project(4,Audit AountsPayable,1425);INSERTINTOdepartmentVALUES(50,Maintenance,925300,projectlist(project(1,Repair Leakin Roof,2850),project(2,Install NewDoor Locks,1700),project(3,Wash FrontWindows,975),project(4,Repair FaultyWiring,1350),project(5,Winterize CoolingSystem,1125);INSERTINTOdepartmentVALUES(60,Security,750400,projectlist(project(1,Issue NewEmployee Badges,13500),project(2,Find MissingIC Chips,2750),project(3,Upgrade AlarmSystem,3350),project(4,Inspect EmergencyExits,1900);END;现在,让我们对Security系做个更新操作DECLARE new_projects projectlist:=projectlist(project(1,Issue NewEmployee Badges,13500),project(2,Develop NewPatrol Plan,1250),project(3,Inspect EmergencyExits,1900),project(4,Upgrade AlarmSystem,3350),project(5,Analyze LocalCrime Stats,825);BEGIN UPDATEdepartment SET projects=new_projects WHERE dept_id=60;END;接下来,对Aounting系做一次查询操作,并把结果放到本地变量中去DECLARE my_projects projectlist;BEGIN SELECT projects INTO my_projects FROM department WHERE dept_id=30;END;最后,删除记录AountingBEGIN DELETEFROM department WHEREdept_id=30;END; 3、使用SQL语句操作特定的集合元素默认情况下,SQL操作会一次性的保存或检索整个集合而不是一个独立的元素。 要用SQL语句操作集合中的独立的元素,可以使用TABLE操作符。 TABLE操作符用一个子查询把变长数组或嵌套表的内容提取出来,这样的话,INSERT、UPDATE或DELETE语句就可以作用于嵌套表,而不是整张数据表了。 下面,让我们看看一些具体的操作实例。 ?例一向嵌套表中插入元素首先,我们向历史系的嵌套表COURSES插入一条记录BEGIN-The TABLEoperator makesthe statementapply to the nested-table from theHistoryrow ofthe DEPARTMENTtable.INSERTINTOTABLE(SELECT coursesFROM department WHERE NAME=History)VALUES(Modern China);END;?例二更新嵌套表中的元素然后对嵌套表的学分进行调整BEGIN UPDATETABLE(SELECT coursesFROM departmentWHERE NAME=Psychology)SET credits=credits+adjustment WHEREcourse_no IN(2200,3540);END;?例三从嵌套表中检索一个元素下面,我们从历史系检索出一个特定课程名称DECLARE my_title VARCHAR2 (64);BEGIN-We knowthat thereis onehistory coursewithEtruscan-in thetitle.This queryretrieves theplete title-from thenestedtable of coursesfor theHistory department.SELECT title INTOmy_title FROMTABLE(SELECT coursesFROM departmentWHERE NAME=History)WHERE NAMELIKE%Etruscan%;END;?例四从嵌套表中删除元素最后,我们从英语系中删除所有那些学分为5的课程BEGIN DELETETABLE(SELECT coursesFROM departmentWHERE NAME=English)WHERE credits=5;END;?例五从变长数组中检索元素下面例子演示了从变长数组类型的字段projects中检索出公务处第四个项目的名称和费用DECLARE my_cost NUMBER(7,2);my_title VARCHAR2 (35);BEGIN SELECTCOST,title INTOmy_cost,my_title FROMTABLE(SELECTprojects FROMdepartmentWHEREdept_id=50)WHERE project_no=4;.END;?例六对变长数组应用INSERT、UPDATE和DELETE操作目前
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025别墅土建合同:高品质别墅景观绿化工程
- 2025版汽车维修保养连锁经营合作协议
- 2025版燃油行业人才培养及交流合同
- 2025版水电安装与设备更换合同
- 2025年度厂房出售及配套设施购置合同示范文本
- 2025年度展览中心场地租赁合同终止及展览合作协议
- 2025年度环境监测技术服务合同范本
- 2025版智慧城市建设用水泵采购及安装合同
- 2025年度汽车零部件供应链合作协议书
- 2025年房地产销售大数据分析服务购销合同
- 学校购买文具用品的供货合同2025年
- 工程项目全过程造价管理课件
- 物业保安各岗位培训
- 小学二年级下安全课件
- 《安全管理体系》课件
- 树立正确的人生价值观课件
- 防腐保温工程监理实施细则
- 园林绿化工知识考试题库及答案
- 法律事务所信息安全管理制度
- 论高校思政教育宏大叙事的有效性建构
- 塔吊拆卸安全专项施工方案
评论
0/150
提交评论