记录表TABLE的使用详解
定义记录表(或索引表)数据类型与记录类型相似,但它是对记录类型的扩展。它可以处理多行记录,类似于高级中的二维数组,使得可以在PL/SQL中模仿数据库中的表。
定义记录表类型的语法如下:
|
1
2
|
TYPE table_name IS TABLE OF element_type [NOT NULL]INDEX BY [BINARY_INTEGER | PLS_INTEGER | VARRAY2]; |
记录表中的方法:
|
方法 |
描述 |
|
EXISTS(n) |
如果集合的第n个成员存在,则返回true |
|
COUNT |
返回已经分配了存储空间即赋值了的成员数量 |
|
FIRST LAST |
FIRST:返回成员的最低下标值 LAST:返回成员的最高下标值 |
|
PRIOR(n) |
返回下标为n的成员的前一个成员的下标。如果没有则返回NULL |
|
NEXT(N) |
返回下标为n的成员的后一个成员的下标。如果没有则返回NULL |
|
TRIM |
TRIM:删除末尾一个成员 TRIM(n) :删除末尾n个成员 |
|
DELETE |
DELETE:删除所有成员 DELETE(n) :删除第n个成员 DELETE(m, n) :删除从n到m的成员 |
|
EXTEND |
EXTEND:添加一个null成员 EXTEND(n):添加n个null成员 EXTEND(n,i):添加n个成员,其值与第i个成员相同 |
|
LIMIT |
返回在varray类型变量中出现的最高下标值 |
例1:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
DECLARE TYPE dept_table_type IS TABLE OF dept%ROWTYPE INDEX BY BINARY_INTEGER; my_dname_table dept_table_type; v_count number(2) :=4;BEGIN FOR int IN 1 .. v_count LOOP SELECT * INTO my_dname_table(int) FROM dept WHERE deptno=int*10; END LOOP; FOR int IN my_dname_table.FIRST .. my_dname_table.LAST LOOP DBMS_OUTPUT.PUT_LINE('Department number: '||my_dname_table(int).deptno); DBMS_OUTPUT.PUT_LINE('Department name: '|| my_dname_table(int).dname); END LOOP;END; |
例2&3:按一维数组使用记录表例 & 按二维数组使用记录表
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
DECLARE--定义记录表数据类型 TYPE reg_table_type IS TABLE OF varchar2(25) INDEX BY BINARY_INTEGER;--声明记录表数据类型的变量 v_reg_table REG_TABLE_TYPE; BEGIN v_reg_table(1) := 'Europe'; v_reg_table(2) := 'Americas'; v_reg_table(3) := 'Asia'; v_reg_table(4) := 'Middle East and Africa'; v_reg_table(5) := 'NULL'; DBMS_OUTPUT.PUT_LINE('地区名称:'||v_reg_table (1)||'、' ||v_reg_table (2)||'、' ||v_reg_table (3)||'、' ||v_reg_table (4)); DBMS_OUTPUT.PUT_LINE('第5个成员的值:'||v_reg_table(5));END; |
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
DECLARE--定义记录表数据类型 TYPE emp_table_type IS TABLE OF employees%ROWTYPE INDEX BY BINARY_INTEGER;--声明记录表数据类型的变量 v_emp_table EMP_TABLE_TYPE;BEGIN SELECT first_name, hire_date, job_id INTO v_emp_table(1).first_name,v_emp_table(1).hire_date, v_emp_table(1).job_id FROM employees WHERE employee_id = 177; SELECT first_name, hire_date, job_id INTO v_emp_table(2).first_name,v_emp_table(2).hire_date, v_emp_table(2).job_id FROM employees WHERE employee_id = 178; DBMS_OUTPUT.PUT_LINE('177雇员名称:'||v_emp_table(1).first_name ||' 雇佣日期:'||v_emp_table(1).hire_date ||' 岗位:'||v_emp_table(1).job_id); DBMS_OUTPUT.PUT_LINE('178雇员名称:'||v_emp_table(2).first_name ||' 雇佣日期:'||v_emp_table(2).hire_date ||' 岗位:'||v_emp_table(2).job_id);END; |
浙公网安备 33010602011771号