Plsql Oracle11g:在将新类型声明为表时,我必须添加“1”;按PLS“U整数”索引;?

Plsql Oracle11g:在将新类型声明为表时,我必须添加“1”;按PLS“U整数”索引;?,plsql,oracle11g,Plsql,Oracle11g,通过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

通过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;
回应“我必须补充”。简而言之,答案是否定的

区别在于

TYPE RT_CLIENTS IS TABLE OF CUR_CLIENTS%ROWTYPE;
是一个嵌套表。这意味着对于这种类型的给定变量,我们知道下标是顺序的。i、 e.下标从1开始,一直到数组长度

因此,以下循环是访问嵌套表数组的正确方法:

FOR I IN 1..LT_CLIENTS.COUNT LOOP
但是,这称为关联数组:

TYPE RT_CLIENTS IS TABLE OF CUR_CLIENTS%ROWTYPE INDEX BY PLS_INTEGER;
(如果需要,还可以通过
varchar2
进行索引)。不同之处在于,本例中的下标不必是连续的,这取决于数组的填充方式。在您的代码中,它们可能是(就像批量收集那样),但情况并非总是如此

通过
数组访问和循环
索引的安全方法是:

  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;
其中,
v_下标
是与
部分的索引具有相同数据类型的变量

此外,使用嵌套表,还可以使用以下内容快速填充数组:

declare
  type myarr is table of number;
  t_arr         myarr;
    v_subscript   number;
begin
  t_arr := myarr(1, 12, 44);
而使用数组索引时,必须有三行代码才能填充它:

  t_arr(1):= 1;
  t_arr(2):= 12;
  t_arr(3):= 44;
对于您的特定情况,不使用
索引就可以了

进一步阅读: