我有一个由表列的行类型创建的关联数组 .
举个例子,它是这样的(表名不同,但结构是一样的):
这是表的DDL
CREATE TABLE employees
(
id NUMBER,
name VARCHAR2(240),
salary NUMBER
);
这是我的程序正在做的事情:
DECLARE
TYPE table_of_emp
IS TABLE OF employees%ROWTYPE INDEX BY BINARY_INTEGER;
emp TABLE_OF_EMP;
BEGIN
IF emp IS NULL THEN
dbms_output.Put_line('Null associative array');
ELSE
dbms_output.Put_line('Not null');
END IF;
END;
我认为这应该导致"Null associative array"被打印 . 但是, if
条件失败,执行跳转到else部分 .
现在如果我放入 for
循环来打印集合值
DECLARE
TYPE table_of_emp
IS TABLE OF employees%ROWTYPE INDEX BY BINARY_INTEGER;
emp TABLE_OF_EMP;
BEGIN
IF emp IS NULL THEN
dbms_output.Put_line('Null associative array');
ELSE
dbms_output.Put_line('Not null');
FOR i IN emp.first..emp.last LOOP
dbms_output.Put_line('Emp name: '
|| Emp(i).name);
END LOOP;
END IF;
END;
然后程序单元引发异常,引用for循环线
ORA-06502:PL / SQL:数值或值错误
我认为是因为null关联数组 . 是否由于null关联数组而引发错误?
那么为什么第一次检查失败呢?我究竟做错了什么?
数据库服务器是Oracle 11g EE(版本11.2.0.3.0 64位)
2 回答
我认为这应该导致"Null associative array"被打印 . 这种假设对于关联数组是错误的 . 它们在声明时存在,但是是空的 . 对于其他类型的PL / SQL集合,这是正确的:
相比:
变量数组正确完成:
因为关联数组为空
first
和last
为空,这就是为什么你的第二个例子导致ORA-06502: PL/SQL: Numeric or value error
:EDIT 另请注意,关联数组可以是稀疏的 . 循环
first
和last
之间的数字将为任何稀疏的集合引发异常 . 而是像这样使用first
和next :(Last
和prev
循环另一个方向 . )我不打算回答为什么第一次检查失败 . 我从来没有想过做这样的事情,我很惊讶它没有引起错误 .
你're getting an exception raised on the loop is, as you'注意到,索引
emp.first
不存在的原因 .您应该检查是否存在此索引,而不是检查空值 . 你可以使用
.exists(i)
语法: