如题

解决方案 »

  1.   

    --//oracle 内存表(PL/SQL表)和数组内存表:
    >怎样用PL/SQL表实现数组功能    
    PL/SQL表与其他过程化语言(如C语言)的一维数组类似。
    实现PL/SQL表需要创建一个数据类型并另外进行变量说明。   
     Type <类型名> Is    
       Table Of <数据类型>    
       Index by Binary_Integer;以下为一个例子:
    Declare   
     Type Array_type is     
       Table Of Number    
       Index by Binary_Integer;   
     My_Array Array_type;
    Begin  
      For I In 1..10 Loop   
         My_Array(I) := I*2;
      End Loop;   
      For I In 1..10 Loop   
         Dbms_Output.Put_line(To_char(My_Array(I)));  
      End Loop;
    End;创建变量数组
    创建一个数组类似于创建一个PL/SQL表,
    因为首先需要声明类型,然后创建那种类型的一个变量。
    但是又不同于PL/SQL表,一个数组是"紧凑的",
    不是"松散的"—在数组中没有"空洞",空洞是指没有数据,这点与表完全不同。
    还有, PL/SQL表事实上是没有界限的,而数组有一个明确的限制。
    当创建一个数组时,数组为空,并且可以被测试为无效。
    为了能够使用它,必须首先使用一个构造器初始化它,如下列代码所示:
    --声明数组
    Type Performers Is Varray(200) Of Varchar2(10);
    Type Contacts Is Varray(200) Of prospects;
    --定义数组
    showLineup Performers('Juggler','Singer','Fire Swallower');
    myContacts Contacts := Contacts('John','Mary','Tito');
    --------------------------------------
    pl/sql表的定义:
    是一维的(说明pl/sql表只能有1列,于一维数组很相似)、无边界的(表行数没有限制,动态增长,定义时并没有为其分配任何行)、由同类(pl/sql表只有1列,自然同类)元素组成的稀疏(行被赋值后,该行才会存在于表中,行不必按顺序定义,可以给表中的任何行赋值,如1行和100行赋值,他们中间可不给行赋值;VARRAY就不行,VARRAY声明后即分配内存等待被使用)集合,并通过整数来索引(单索引模式,BINARY_INTEGER来索引,充当主键,正负2的31次方减1的范围,可以为负数是因为这个行好仅仅是一个数字而已,本身并不代表顺序)。pl/sql表驻留在oracle server的私有pl/sql区域中。由于pl/sql表只是pl/sql中定义的一种结构,并不是真实可访问的表(所以不存在commit,rollback,select,insert,update,delete操作),RDBMS或SQL内核并不识别他,所以对他的操作受到限制,比如pl/sql中的DML就不能操作他,因为DML要提交给RDBMS来处理。
    只能通过循环一次一行的浏览pl/sql表的内容。1,声明pl/sql表
    [语法:TYPE <table_type_name> IS TABLE OF <datatype> [NOT NULL] INDEX BY BINARY_INTEGER;]
    declare
      type empRec is record
      (
       empNo varchar2(50),
       empName varchar2(50),
       empAge number
      );
      TYPE emptblTYPE IS TABLE OF empRec INDEX BY BINARY_INTEGER; 
      tEmp emptblTYPE;    
      CURSOR c_dept IS SELECT * from employee;
      
      --//定义变量
      EmpCount number;
      MaxEmpNo number;
    BEGIN    
      FOR curEmp IN c_dept LOOP                        
        tEmp(c_dept%ROWCOUNT).empNo:=curEmp.No; 
      END LOOP; 
      
      select count(1),max(NO) into EmpCount,MaxEmpNo from employee;
      
      For I In 1..EmpCount Loop   
         DBMS_OUTPUT.PUT_LINE(tEmp(I).empNo);
      End Loop;
      
      DBMS_OUTPUT.PUT_LINE('the maxNo is:'||MaxEmpNo);