索引表类似于程序语言中的数组,可以保存多个数据,并且通过下标来访问每一个数据,但是在 Oracle 中可用来定义索引表下标的数据类型可以是整数也可以是字符串。
但是在Oracle中定义的索引表与程序中的数组还有以下的区别:
- 索引表不需要进行初始化,而已直接为指定索引赋值,开辟的索引表的索引不一定必须连续。
- 索引表不仅可以使用数字作为索引下标,也可以利用字符串表示索引下标,使用数字作为索引下标时也可以设置为负数。
定义索引表
- TYPE TYPE_NAME IS TABLE OF DATA_TYPE [NOT NULL]
INDEX BY [PLS_INTEGER | BINARY_INTEGER | VARCHAR2(LENGTH)];
DECLARE
TYPE INFO_INDEX IS TABLE OF VARCHAR2(20)
INDEX BY PLS_INTEGER;
V_INFO INFO_INDEX;
BEGIN
V_INFO(1) := 'JAVA';
V_INFO(10) := 'PL/SQL';
IF V_INFO.EXISTS(1) THEN
DBMS_OUTPUT.PUT_LINE(V_INFO(1));
ELSE
DBMS_OUTPUT.PUT_LINE('NOT EXISTS');
END IF;
IF V_INFO.EXISTS(30) THEN
DBMS_OUTPUT.PUT_LINE(V_INFO(30));
ELSE
DBMS_OUTPUT.PUT_LINE('NOT EXISTS');
END IF;
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT('WRONG:'|| SQLCODE || SQLERM);
END;
DECLARE
TYPE DEPT_INDEX IS TABLE OF DEPT%ROWTYPE
INDEX BY PLS_INTEGER;
V_DEPT DEPT_INDEX;
BEGIN
V_DEPT(0).DEPT := 80;
V_DEPT(0).DNAME := 'MLDN';
V_DEPT(0).LOC := 'PEKING';
IF V_DEPT.EXISTS(0) THEN
DBMS_OUTPUT.PUT_LINE();
END IF;
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT('WRONG:'|| SQLCODE || SQLERM);
END;
DECLARE
TYPE DEPT_TYPE IS RECORD(
DEPTNO DEPT.DEPTNO%TYPE,
DNAME DEPT.DNAME%TYPE,
LOC DEPT.LOC%TYPE
);
TYPE DEPT_INDEX IS TABLE OF DEPT_TYPE
INDEX BY PLS_INTEGER;
V_DEPT DEPT_INDEX;
BEGIN
V_DEPT(0).DEPT := 80;
V_DEPT(0).DNAME := 'MLDN';
V_DEPT(0).LOC := 'PEKING';
IF V_DEPT.EXISTS(0) THEN
DBMS_OUTPUT.PUT_LINE();
END IF;
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT('WRONG:'|| SQLCODE || SQLERM);
END;