数组基础

来源:互联网 发布:沈阳seo 公司 编辑:程序博客网 时间:2024/05/16 12:49

CREATE OR REPLACE PROCEDURE sample 
is 
    TYPE R_REC IS RECORD(INT     NUMBER(6,2), CHR    VARCHAR2(100));
    TYPE T_REC IS TABLE OF R_REC INDEX BY BINARY_INTEGER;
 
    A_ZEI T_REC;   
    IX      NUMBER(10);   
BEGIN 
    FOR IX IN 1..1000 LOOP  
        A_ZEI(IX).INT := IX;
        A_ZEI(IX).CHR := TO_CHAR(A_ZEI(IX).INT,'9,999,999.99'); 
    END LOOP;  
END; 

CREATE OR REPLACE PROCEDURE P_EMP
IS
     TYPE T_EMP IS TABLE OF EMP%ROWTYPE INDEX BY BINARY_INTEGER; 
     A_EMP T_EMP;
     I        BINARY_INTEGER := 0;
BEGIN
   
     FOR REC IN (SELECT EMPNO,ENAME FROM EMP) LOOP
        I := I + 1;
        A_EMP(I).EMPNO := REC.EMPNO;
        A_EMP(I).ENAME := REC.ENAME;
     END LOOP;
   
     FOR K IN 1..I LOOP
        DBMS_OUTPUT.PUT_LINE( A_EMP(K).EMPNO || '       ' || A_EMP(K).ENAME);
     END LOOP;
END;
   

集合:是具有相同定义的元素的聚合。Oracle有两种类型的集合:

可变长数组(VARRAY):可以有任意数量的元素,但必须预先定义限制值。

嵌套表:视为表中之表,可以有任意数量的元素,不需要预先定义限制值。


在PL/SQL中是没有数组(Array)概念的。但是如果程序员想用Array的话,就得变通一下,用TYPE 和Table of Record来代替多维数组,一样挺好用的。
emp_type 就好象一个table 中的一条record 一样,里面有id, name,gender等。emp_type_array 象个table, 里面含有一条条这样的record (emp_type),就象多维数组一样。

--单维数组

declare
  type emp_ssn_array is table of number index by binary_integer;

  best_employees  emp_ssn_array;
  worst_employees emp_ssn_array;

begin
  best_employees(1) := '123456';
  best_employees(2) := '888888';

  worst_employees(1) := '222222';
  worst_employees(2) := '666666';

  for i in 1 .. best_employees.count
  loop
    dbms_output.put_line('i=' || i || ', best_employees= ' || best_employees(i) || ', worst_employees= ' || worst_employees(i));
  end loop;

end;

--多维数组

declare

  type emp_type is record(
    emp_id     emp.empno%type,
    emp_name   emp.ename%type,
    emp_job    emp.job%type);

  type emp_type_array is table of emp_type index by binary_integer;

  emp_rec_array emp_type_array;
  emp_rec       emp_type;

begin
  emp_rec.emp_id     := 3000;
  emp_rec.emp_name   := 'Barbara';
  emp_rec.emp_job    := 'sales';

  emp_rec_array(1) := emp_rec;

  emp_rec.emp_id     := 3008;
  emp_rec.emp_name   := 'Rick';
  emp_rec.emp_job    := 'engineer';

  emp_rec_array(2) := emp_rec;

  for i in 1 .. emp_rec_array.count
  loop
    dbms_output.put_line('i=' || i || ', emp_id =' || emp_rec_array(i).emp_id || ', emp_name =' || emp_rec_array(i).emp_name ||
                         ', emp_job = ' || emp_rec_array(i).emp_job);
  end loop;

end;

 

DECLARE 
    TYPE   CourseList   IS   TABLE   OF   VARCHAR2(10); 
    courses   CourseList;
BEGIN 
    -- 初始化数组元素,大小为3 
    courses   :=   CourseList( 'Biol   4412 ',   'Psyc   3112 ',   'Anth   3001 ');
    -- 为数组增加一个元素,数组大小为4,末尾的元素为NULL 
    courses.EXTEND;     --   append   one   null   element 
    -- 为增加的元素赋值,如果没用EXTEND,这里会出错 
    courses(4) := 'Engl   2005 ';

    for idx in 1..courses.count
    loop
      dbms_output.put_line('the array list is: '||courses(idx));
    end loop; 
end;