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

解决方案 »

  1.   

    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个虚拟的嵌套表。但实际来讲,物理上只有一个父表和一个子表
     
      

  2.   

    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个虚拟的嵌套表。但实际来讲,物理上只有一个父表和一个子表
     
      

  3.   

    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 = 111;
    =========================直接进行嵌套表的查询,只能返回主表的一条记录的子表,即如果course_material返回多于2条的记录则报错
    select * from the(select required_reading from course_material where department='his');

    select * from the(select required_reading from course_material where department='his') where catalog_number=999
    报错:select * from the(select required_reading from course_material where department in ('his','www'))