这次就标号数组(或者叫键值数组)的键的是否存在的检查,进行说明。
标号数组可以新增加键,并给予赋值,同时将该键的区域分配给存储器。
也就是说,通过新增加键值,可以轻松扩展领域保存数值。
那么,用新的键代入来扩展区域的话,如果使用不存在的的键,会发生错误。
例子:
<使用不存在的键访问而导致错误的示例>
SQL> connect scott/tiger
已连接。
SQL> SET SERVEROUTPUT ON
SQL> DECLARE
2 TYPE A_TYPE IS TABLE OF VARCHAR2(100) INDEX BY BINARY_INTEGER;
3 A A_TYPE;
4 BEGIN
5A(1):=‘一’;
6A(3):=‘3’;
7 DBMS_OUTPUT.PUT_LINE(A(2));
8 END;
9 /
DECLARE
行1发生错误。:
ORA-01403:找不到数据。
ORA-06612:行7
在这里,键值1和键值3分别用键值1和键值3代入键值数组A中,对应的键值分别是“1”和“3”。(第5-6行)
因此,键值2不存在,但使用了(第7行),结果出错:“ORA-01403:找不到数据”
“ORA-01403:找不到数据。”这样的错误和SELECT INTO语句为0件时的错误相同,
可以以NO DATA FOUND异常(或者叫做例外)处理例外。
例子如下:
<对不存在的键的错误进行例外处理的示例>
SQL> DECLARE
2 TYPE A_TYPE IS TABLE OF VARCHAR2(100) INDEX BY BINARY_INTEGER;
3 A A_TYPE;
4 BEGIN
5A(1):=‘一’;
6A(3):=‘3’;
7 DBMS_OUTPUT.PUT_LINE(A(2));
8 EXCEPTION
9 WHEN NO_DATA_FOUND THEN
10 DBMS_OUTPUT.PUT_LINE(“引用了不存在的键值”);
11 END;
12 /
引用了不存在的键值
PL/SQL过程成功完成。
与刚才的例子不同的是,追加了8-10行。
这里,由于NO DATA FOUND例外处理程序,对于参照了不存在的键值时的错误,显示“参照了不存在的键值”的信息,使之“正常完成”。
但是,这样的话,只不过是因为发生了错误才进行例外处理并正常完成的。
这是发生错误的时候才判断,应该在发生错误之前进行错误判断才合理。
例子如下:
<事先检查键值的存在的示例>
SQL> DECLARE
2 TYPE A_TYPE IS TABLE OF VARCHAR2(100) INDEX BY BINARY_INTEGER;
3 A A_TYPE;
4 BEGIN
5A(1):=‘一’;
6A(3):=‘3’;
7 IF A.EXISTS(2) THEN
8 DBMS_OUTPUT.PUT_LINE(A(2));
9 ELSE
10 DBMS_OUTPUT.PUT_LINE(“键值2不存在”);
11 END IF;
12 END;
13 /
键值2不存在
PL/SQL过程成功完成。
这里,要点是第7行的记述。
A.EXISTS(2)的记述是如果键值2存在于键值数组A中,则返回TRUE,如果不存在,则返回FALSE,结果这次执行了ELSE以下第10行的代码,显示了“键值2不存在”这样的信息。
这样,我们就可以在引用键值数组之前可以检查其键值的存在,防止以不存在的键值引用错误。
另外,这个“EXISTS”是组合排列的方法之一。
本章到此为止,谢谢。