网上说的nested table 是稀松的而varray是密集的,这里的稀松 密集是什么意思?  是说下标可以不连续吗?还有varray可以删除单独记录,而nested table不可以,这是为什么?

解决方案 »

  1.   

    record:该集合可以存储一对多的标量属性。
    pl/sql表:是pl/sql代码中的“表”,只存在应用运行期间(内存里),类似“数组”,稀疏的,大小可以动态增长,可以有负下标,但不能存储在数据库表中。
    varray:与pl/sql区别是可以在表列中存储,是密集的,不能删除单独记录,不能有负下标,固定大小的集合。
    nested table:可以在表列中存储,稀疏的,可以删除单独记录,不能有负下标,大小可变。1、记录:SQL> declare
      2 type emp_rec_t is record(
      3 no number,
      4 name varchar2(10)
      5 );
      6 emp1 emp_rec_t;
      7 emp2 emp_rec_t;
      8 begin
      9 emp1.no:=1;
     10 emp1.name:='chennan';
     11 emp2:=emp1; 同一记录类型,可以直接赋值
     12 dbms_output.put_line('emp2.no='||emp2.no);
     13 dbms_output.put_line('emp2.name='||emp2.name);
     14 end;
     15 /
    emp2.no=1
    emp2.name=chennanPL/SQL 过程已成功完成。SQL>
    SQL> declare
      2 type emp_rec_t is record(
      3 no number,
      4 name varchar2(10)
      5 );
      6
      7 type mgr_rec_t is record(
      8 no number,
      9 name varchar2(10)
     10 );
     11
     12 emp1 emp_rec_t;
     13 mgr1 mgr_rec_t;
     14
     15 begin
     16 emp1.no:=1;
     17 emp1.name:='chennan';
     18 mgr1:=emp1; -- 尽管字段类型相同,但不是同一记录类型,不能直接赋值
     19 end;
     20 /
    mgr1:=emp1; -- 尽管字段类型相同,但不是同一记录类型,不能直接赋值
      *
    ERROR 位于第 18 行:
    ORA-06550: 第 18 行, 第 7 列:
    PLS-00382: 表达式类型错误
    ORA-06550: 第 18 行, 第 1 列:
    PL/SQL: Statement ignored2、pl/sql表:SQL> declare
      2 -- 自定义记录类型
      3 type rec_t is record(
      4 empno number,
      5 ename varchar2(10)
      6 );
      7 -- 数组类型
      8 type varray_t1 is table of varchar(10) index by binary_integer; -- 单字段数组
      9 type varray_t2 is table of rec_t index by binary_integer; -- 自定义多字段数组
     10 type varray_t3 is table of emp%rowtype index by binary_integer; -- 表的行记录数组
     11 -- 数组变量
     12 varray1 varray_t1;
     13 varray2 varray_t2;
     14 varray3 varray_t3;
     15 i integer;
     16 j integer;
     17 begin
     18 i:=0;
     19 for x in (select * from emp where rownum<4) loop
     20 varray1(i):=x.ename;
     21 varray2(i).empno:=x.empno;
     22 varray2(i).ename:=x.ename;
     23 varray3(i):=x;
     24 i:=i+1;
     25 end loop;
     26 dbms_output.put_line('--------------');
     27 for i in 0 .. varray1.count-1 loop
     28 dbms_output.put_line('varray1('||i||')='||varray1(i));
     29 end loop;
     30 dbms_output.put_line('--------------');
     31 for i in 0 .. varray2.count-1 loop
     32 dbms_output.put_line('varray2('||i||').empno='||varray2(i).empno);
     33 dbms_output.put_line('varray2('||i||').ename='||varray2(i).ename);
     34 end loop;
     35 dbms_output.put_line('--------------');
     36 for i in 0 .. varray3.count-1 loop
     37 dbms_output.put_line('varray3('||i||').empno='||varray3(i).empno);
     38 dbms_output.put_line('varray3('||i||').ename='||varray3(i).ename);
     39 dbms_output.put_line('varray3('||i||').job='||varray3(i).job);
     40 -- ......
     41 end loop;
     42 dbms_output.put_line('--------------');
     43 i:=varray3.first;
     44 while i is not null loop
     45 dbms_output.put_line('varray3('||i||').ename='||varray3(i).ename);
     46 i:=varray3.next(i);
     47 end loop;
     48 dbms_output.put_line('--------------');
     49 i:=varray3.first;
     50 j:=varray3.last;
     51 while i<=j loop
     52 dbms_output.put_line('varray3('||i||').ename='||varray3(i).ename);
     53 i:=varray3.next(i);
     54 end loop;
     55 dbms_output.put_line('----- before delete -----');
     56 dbms_output.put_line('varray3 has '||varray3.count||' rows');
     57 varray3.delete(1);
     58 dbms_output.put_line('delete rows(1) then varray3 has '||varray3.count||' rows');
     59 dbms_output.put_line('----- now varray3 :----');
     60 i:=varray3.first;
     61 j:=varray3.last;
     62 while i<=j loop
     63 dbms_output.put_line('varray3('||i||').ename='||varray3(i).ename);
     64 i:=varray3.next(i);
     65 end loop;
     66 varray3.delete;
     67 dbms_output.put_line(' ----- when delete all,now varray3 has '||varray3.count||' rows');
     68 end;
     69 /
    --------------
    varray1(0)=SMITH
    varray1(1)=ALLEN
    varray1(2)=WARD
    --------------
    varray2(0).empno=7369
    varray2(0).ename=SMITH
    varray2(1).empno=7499
    varray2(1).ename=ALLEN
    varray2(2).empno=7521
    varray2(2).ename=WARD
    --------------
    varray3(0).empno=7369
    varray3(0).ename=SMITH
    varray3(0).job=CLERK
    varray3(1).empno=7499
    varray3(1).ename=ALLEN
    varray3(1).job=SALESMAN
    varray3(2).empno=7521
    varray3(2).ename=WARD
    varray3(2).job=SALESMAN
    --------------
    varray3(0).ename=SMITH
    varray3(1).ename=ALLEN
    varray3(2).ename=WARD
    --------------
    varray3(0).ename=SMITH
    varray3(1).ename=ALLEN
    varray3(2).ename=WARD
    ----- before delete -----
    varray3 has 3 rows
    delete rows(1) then varray3 has 2 rows
    ----- now varray3 :----
    varray3(0).ename=SMITH
    varray3(2).ename=WARD
    ----- when delete all,now varray3 has 0 rowsPL/SQL 过程已成功完成。SQL>3、varraysSQL> create type emp_type as object(
      2 empno number,
      3 ename varchar2(10)
      4 );
      5 /类型已创建。SQL> create type emp_type_list as varray(50) of emp_type;
      2 /类型已创建。SQL> create table myemp(
      2 deptno number,
      3 deptname varchar2(10),
      4 manager emp_type,
      5 employees emp_type_list
      6 );表已创建。SQL> insert into myemp(deptno,deptname,manager,employees) values(
      2 10,'ACCOUNTING',emp_type(7782,'CLARK'),emp_type_list(emp_type(7934,'MILLER'),emp_type(1223,'TEST')));已创建 1 行。SQL> insert into myemp(deptno,deptname,manager,employees) values(
      2 20,'RESEARCH',emp_type(7566,'JONES'),emp_type_list(emp_type(7902,'FORD'),emp_type(7788,'SCOTT'),emp_type(4567,'OTHER')));已创建 1 行。SQL> col employees for a100
    SQL> col manager for a30
    SQL> select * from myemp;  DEPTNO DEPTNAME MANAGER(EMPNO, ENAME) EMPLOYEES(EMPNO, ENAME)
    ---------- ---------- ------------------------------ ----------------------------------------------------------------------------------------
      10 ACCOUNTING EMP_TYPE(7782, 'CLARK') EMP_TYPE_LIST(EMP_TYPE(7934, 'MILLER'), EMP_TYPE(1223, 'TEST'))
      20 RESEARCH EMP_TYPE(7566, 'JONES') EMP_TYPE_LIST(EMP_TYPE(7902, 'FORD'), EMP_TYPE(7788, 'SCOTT'), EMP_TYPE(4567, 'OTHER'))已选择2行。
      

  2.   

    to 1L:
    你找的还真准啊,我也看到这篇文章了
    你copy过来了,多谢。。
    帮我解释下我的问题啊
      

  3.   

    大家帮我看下:3、varraysSQL> create type emp_type as object(
      2 empno number,
      3 ename varchar2(10)
      4 );
      5 /类型已创建。SQL> create type emp_type_list as varray(50) of emp_type;
      2 /类型已创建。SQL> create table myemp(
      2 deptno number,
      3 deptname varchar2(10),
      4 manager emp_type,
      5 employees emp_type_list
      6 );表已创建。SQL> insert into myemp(deptno,deptname,manager,employees) values(
      2 10,'ACCOUNTING',emp_type(7782,'CLARK'),emp_type_list(emp_type(7934,'MILLER'),emp_type(1223,'TEST')));已创建 1 行。SQL> insert into myemp(deptno,deptname,manager,employees) values(
      2 20,'RESEARCH',emp_type(7566,'JONES'),emp_type_list(emp_type(7902,'FORD'),emp_type(7788,'SCOTT'),emp_type(4567,'OTHER')));已创建 1 行。SQL> col employees for a100
    SQL> col manager for a30
    SQL> select * from myemp;  DEPTNO DEPTNAME MANAGER(EMPNO, ENAME) EMPLOYEES(EMPNO, ENAME)
    ---------- ---------- ------------------------------ ----------------------------------------------------------------------------------------
      10 ACCOUNTING EMP_TYPE(7782, 'CLARK') EMP_TYPE_LIST(EMP_TYPE(7934, 'MILLER'), EMP_TYPE(1223, 'TEST'))
      20 RESEARCH EMP_TYPE(7566, 'JONES') EMP_TYPE_LIST(EMP_TYPE(7902, 'FORD'), EMP_TYPE(7788, 'SCOTT'), EMP_TYPE(4567, 'OTHER'))已选择2行。这个在sql window 里查出来的结果是这样的:
    DEPTNO  DEPTNAME    MANAGER.EMPNO MANAGER.ENAME  EMPLOYEES   (它把manager这个record分成两个字段了)
    10 ACCOUNTING 7782 CLARK <Collection>
    20 RESEARCH 7566 JONES <Collection>
    而在command window 里查出来却是这样的:
     DEPTNO DEPTNAME   MANAGER EMPLOYEES
    ---------- ---------- ------- ---------
            10 ACCOUNTING <Object <Object>
            20 RESEARCH   <Object <Object>请问这是为什么?
      

  4.   

    上半部分的查询结果是原来作者的。下面的两种查询结果是我的,为什么会出现这种情况呢? 求解释  我用的是
    PLSQL7.14