添加INDEX BY PLS_INTEGER和不在新表类型声明结束之间的差异是什么.看看这个例子:
DECLARE
GC_BULK_LIMIT CONSTANT INTEGER := 500;
CURSOR CUR_CLIENTS IS SELECT C.ID, C.NAME FROM CLIENTS C;
TYPE RT_CLIENTS IS TABLE OF CUR_CLIENTS%ROWTYPE;
-- TYPE RT_CLIENTS IS TABLE OF CUR_CLIENTS%ROWTYPE INDEX BY PLS_INTEGER;
LT_CLIENTS RT_CLIENTS;
BEGIN
OPEN CUR_CLIENTS;
LOOP
FETCH CUR_CLIENTS BULK COLLECT INTO LT_CLIENTS LIMIT GC_BULK_LIMIT;
EXIT WHEN LT_CLIENTS.COUNT = 0;
FOR I IN 1..LT_CLIENTS.COUNT LOOP
-- ... SOME LOGIC
END LOOP;
END LOOP;
CLOSE CUR_CLIENTS;
END;
Run Code Online (Sandbox Code Playgroud)
响应"必须添加".最简洁的答案是不.
区别在于
TYPE RT_CLIENTS IS TABLE OF CUR_CLIENTS%ROWTYPE;
Run Code Online (Sandbox Code Playgroud)
是嵌套表.这意味着对于这种类型的给定变量,我们知道下标是顺序的.即下标从1开始并上升到数组长度.
因此,以下循环是访问嵌套表数组的正确方法:
FOR I IN 1..LT_CLIENTS.COUNT LOOP
Run Code Online (Sandbox Code Playgroud)
然而,这称为关联数组:
TYPE RT_CLIENTS IS TABLE OF CUR_CLIENTS%ROWTYPE INDEX BY PLS_INTEGER;
Run Code Online (Sandbox Code Playgroud)
(varchar2如果需要,你也可以用a索引).不同之处在于,在这种情况下,下标不必是顺序的,具体取决于数组的填充方式.在你的代码中,它们将是(作为批量收集会这样做),但并非总是如此.
访问和循环index by数组的安全方法是:
v_subscript := t_arr.first;
while v_subscript is not null loop
dbms_output.put_line(v_subscript || ': ' || t_arr(v_subscript));
v_subscript := t_arr.next(v_subscript);
end loop;
Run Code Online (Sandbox Code Playgroud)
where v_subscript是index by部件的相同数据类型的变量.
还可以使用嵌套表,快速填充数组:
declare
type myarr is table of number;
t_arr myarr;
v_subscript number;
begin
t_arr := myarr(1, 12, 44);
Run Code Online (Sandbox Code Playgroud)
而使用数组索引,你必须有三行来填充它:
t_arr(1):= 1;
t_arr(2):= 12;
t_arr(3):= 44;
Run Code Online (Sandbox Code Playgroud)
对于你的特殊情况,没有index by完全没问题.
进一步阅读:http://docs.oracle.com/cd/E18283_01/appdev.112/e17126/composites.htm