|
集合:是具有相同定义的元素的聚合。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 || &nb
sp; ', best_employees= ' ||best_employees(i) || ', worst_employees= ' ||worst_employees(i)); END LOOP; END; --多维数组 DECLARE TYPE emp_type IS RECORD ( emp_id employee_table.emp_id%TYPE, emp_name employee_table.emp_name%TYPE, emp_gender employee_table.emp_gender%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 := 300000000; emp_rec.emp_name := 'Barbara'; emp_rec.emp_gender := 'Female'; emp_rec_array(1) := emp_rec; emp_rec.emp_id := 300000008; emp_rec.emp_name := 'Rick'; emp_rec.emp_gender := 'Male'; 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_gender = '||emp_rec_array(i).emp_gender); END LOOP;
END; -------------- Result -------------- i=1, emp_id =300000000, emp_name =Barbara, emp_gender = Female i=2, emp_id =300000008, emp_name =Rick, emp_gender = Male
用下面语句声明数组类型 type intarray is varry(30) of integer; 用下面语句声明一个数组变量 declare A intarray;
一个例子
declare
stmt varchar2(200);
dept_no_array dbms_sql.Number_Table;
c number;
dummy number;
begin
dept_no_array(1) := 10; dept_no_array(2) := 20;
dept_no_array(3) := 30; dept_no_array(4) := 40;
dept_no_array(5) := 30; dept_no_array(6) := 40;
stmt := 'delete from emp where deptno = :dept_array';
c := dbms_sql.open_cursor;
dbms_sql.parse(c, stmt, dbms_sql.native);
dbms_sql.bind_array(c, ':dept_array', dept_no_array, 1, 4);
dummy := dbms_sql.execute(c);
dbms_sql.close_cursor(c);
exception when others then
if dbms_sql.is_open(c) then
dbms_sql.close_cursor(c);
end if;
raise;
end;
/
|