日期:2014-05-17  浏览次数:20877 次

刚学习plsql,请问一下,游标是不是只查询数据用?复合数据类型中索引表,嵌套表,数组分别适用于什么场合?求大虾帮忙解决这两个问题!!
刚学习plsql,请问一下,游标是不是只查询数据用?复合数据类型中索引表,嵌套表,数组分别适用于什么场合?求大虾帮忙解决这两个问题!!

------解决方案--------------------
When Oracle Database executes a SQL statement, it stores the result set and processing information in an unnamedprivate SQL area. A pointer to this unnamed area, called acursor, lets youretrieve the rows of the result set one at a time.Cursor attributes return information about the state of the cursor.游标是SQL的一个内存工作区,由系统或用户以变量的形式定义。游标的作用就是用于临时存储从数据库中提取的数据块。

索引组织表(index organized table)简称IOT。
 IOT中,数据要根据主键有序地存储。
 适合使用IOT的几种情况:
 · 表完全由主键组成或者只通过主键来访问一个表。使用IOT,表就是索引,可以节约空间,提高效率。
 · 通过外键访问子表,子表使用IOT。通过IOT将相同外键的子表数据物理的存储在同一个位置,查询所需要的物理I/O更少,因为数据都在同一个(几个)块上。
 · 经常在主键或者或惟一键上使用BETWEEN查询。数据以某种特定的顺序物理存储,所以获取这些数据时所需的物理I/O更少。 

索引聚簇表(index clustered table)
聚簇(cluster)是指:如果一组表有一些共同的列,则将这样一组表存储在相同的数据库块中;聚簇还表示把相关的数据存储在同一个块上。
 聚簇并不是有序地存储数据(这是IOT的工作),它是按每个键以聚簇方式存储数据,但数据存储在堆中。利用聚簇,一个块可能包含多个表的数据。聚簇也可以用于单个表,可以按某个列将数据分组存储。
 SQL Server 中的聚簇索引(clustered index)则要求行按索引键有序的方式存储,这类似于前面所述的IOT。 
例如,有部门和员工2张表,将部门号作为聚簇列,建立聚簇表。这样部门号10的部门数据和包括的所有员工数据都存储在同一个块上,如果放不下,则串链其他块。
 但是部门在磁盘上的存储并不是有序的,部门100可能挨在部门1旁边,而与部门101和99离得很远。

嵌套表是Oracle对象关系扩展的一部分。嵌套表是Oracle中的两种集合类型之一,它与关系模型中传统的“父/子表对”里的子表很相似。这是 数据元素的一个无序集,所有数据元素的数据类型都相同,可以是一个内置数据类型,也可以是一个对象数据类型。不过,还不仅如此,因为设计嵌套表是为了制造 一个假象,好像父表中的每一行都有其自己的子表。如果父表中有100行,那么就有100个虚拟的嵌套表。但实际来讲,物理上只有一个父表和一个子表
 

------解决方案--------------------
游标就是从临时存储数据中提取数据
数组不太清楚
索引就是需要提高查询速度啊之类的时候用到
嵌套好像是查询语句,视图用到
------解决方案--------------------
oracle嵌套表示例

----嵌套表:就是把一个表中的字段定义为一个表,这个字段表的数据存储在外部的一个表中,
例如下例嵌套表中的数据存储在required_tab表中。
----嵌套表可以有效地代替多个表之间的连接
create type bookobj as object(
title varchar2(40),
author varchar2(40),
catalog_number number(4)
);
/
create type booklist as table of bookobj; -----------定义一个嵌套表,该表可以被嵌套在其他表中,他的字段就是bookobj中的字段
/
create table course_material(
department char(3),
course number(3),
required_reading booklist -----在表中再定义一个表,即booklist表,他就是嵌套在course_material中的表,也就是嵌套表。
------他和主表course_material之间是主从关系,即一条主表记录对应一个嵌套表中的多条记录。
) nested table required_reading store as required_tab;
/
-----------------------给表和嵌套表输入值,commit后被提交到数据库里保存
declare
v_books booklist:=booklist(bookobj('ssss','www',444));-------定义一个booklist类型的嵌套表变量v_books,并给出初值。
begin
insert into course_material values('cs',101,booklist(bookobj('www','bbb',1),bookobj('aa','dd',33)));
insert into course_material values('his',301,v_books);
end;
或单独插入一条记录:
insert into course_material values('ss',102,booklist(bookobj('w','b',1),bookobj('a','d',3)));
-----------------------更新嵌套表操作,即将required_reading作为一个字段
declare
v_books booklist:=booklist(bookobj('xyz','bbb',111),bookobj('zq','ccc',222));
begin
update course_material
set required_reading = v_books
where department = 'his' and course = 301;
end;
----执行结果为子记录全部被删除,新添加两个bookobj记录
-------------删除嵌套表中的记录
delete from course_material where department = 'his';----对应主表his的嵌套表中的记录将被删除
=============直接对嵌套表进行插入==================
insert into the(select required_reading from course_material where department='his' )
values('gog','ggg',999)
-----上面红色的表示一个表,注意前面必须加上the,表示是嵌套表。
=============直接对嵌套表进行更新==================
update the(select required_reading from course_material where department='his' )
set catalog_number = catalog_number + 10 -----对嵌套表中的字段进行操作
where catalog_number = 111;
=============直接对嵌套表进行删除==================
delete from the(select required_reading from course_material where department='his' )
where catalog_number