0

DELETE CollectionMethod を使用して、次のようなコレクション内のいくつかの要素を削除したいと考えています。

create or replace procedure testloop3 (clearaaa out nestedtable) as
type nestedtable is table of varchar2(255);
reply_ref_messageIds nestedtable; 
getDelete_messageIds nestedtable;   
begin 
 select distinct r.messagebox_id bulk collect into reply_ref_messageIds from reply r;
 select m.id bulk collect into  getDelete_messageIds from messagebox m;
        getDelete_messageIds.delete(2);
   getDelete_messageIds.delete(4);
   getDelete_messageIds.delete(7);
    getDelete_messageIds.delete(11);
     getDelete_messageIds.delete(13);
    for i in getDelete_messageIds.FIRST .. getDelete_messageIds.LAST loop
  dbms_output.put_line(i);
end loop;
for i in 5 .. 12 loop
  dbms_output.put_line(i);
end loop;
end;

次に、この手順を plsql dev でデバッグします

-- Created on 2013/4/4 by THINKPAD 
declare 
  -- Local variables here
 aa nestedtable;
begin
  -- Test statements here
  testloop3(aa);
end;

そして、削除前のインデックスを取得しますが、getDelete_messageIdsこれは 1 から 15

です。ただし、デバッグするgetDelete_messageIds.delete(2);と、インデックス 1 と 2 が削除されます...理由は説明できません。
そして、次のステートメントをデバッグgetDelete_messageIds.delete(4);すると、インデックス 3 と 4 が削除されます。その後、getDelete_messageIds.delete(7);インデックス 7 のみが削除されます...
理解できません...

4

2 に答える 2

1

投稿された手順は、そのようなものを何も示していません。あなたは単にループしています

for idx in 1..15 loop

(.FIRST は 1 に解決され、.LAST は 15 に解決されます)。NT にまだ 15 個の要素があるという意味ではありません。

インデックスが削除されているかどうかを確認していません。ギャップがあるネストされたテーブルをループする適切な方法について混乱していると思います。

つまり、要素が削除されていることがわかります。

SQL> create table messagebox(id ) as select to_char(rownum) from dual connect by level <= 15;

Table created.

SQL> create or replace procedure testloop3
  2  as
  3    type nestedtable is table of varchar2(255);
  4    getDelete_messageIds nestedtable;
  5    v_idx number;
  6  begin
  7      select m.id bulk collect into  getDelete_messageIds from messagebox m;
  8      getDelete_messageIds.delete(2);
  9      getDelete_messageIds.delete(4);
 10      getDelete_messageIds.delete(7);
 11      getDelete_messageIds.delete(11);
 12      getDelete_messageIds.delete(13);
 13      v_idx := getDelete_messageIds.first;
 14      while v_idx is not null
 15      loop
 16        dbms_output.put_line(v_idx);
 17        v_idx := getDelete_messageIds.next(v_idx);
 18      end loop;
 19  end;
 20  /

Procedure created.

SQL> exec testloop3
1
3
5
6
8
9
10
12
14
15

したがって、2、4、7、11、13 が削除されます。まさに予想通り。

于 2013-04-04T16:19:36.463 に答える
1

あなたが見ることができます

DECLARE
   TYPE NumList IS TABLE OF NUMBER;
   n NumList := NumList(1,3,5,7);
   counter INTEGER;
BEGIN
   DBMS_OUTPUT.PUT_LINE('N''s first subscript is ' || n.FIRST);
   DBMS_OUTPUT.PUT_LINE('N''s last subscript is ' || n.LAST);
-- When the subscripts are consecutive starting at 1, 
-- it's simple to loop through them.
   FOR i IN n.FIRST .. n.LAST
   LOOP
      DBMS_OUTPUT.PUT_LINE('Element #' || i || ' = ' || n(i));
   END LOOP;
   n.DELETE(2); -- Delete second element.
-- When the subscripts have gaps
-- or the collection might be uninitialized,
-- the loop logic is more extensive.
-- Start at the first element
-- and look for the next element until there are no more.
   IF n IS NOT NULL THEN
      counter := n.FIRST;
      WHILE counter IS NOT NULL
      LOOP
         DBMS_OUTPUT.PUT_LINE
           ('Element #' || counter || ' = ' || n(counter));
         counter := n.NEXT(counter);
      END LOOP;
   ELSE
      DBMS_OUTPUT.PUT_LINE('N is null, nothing to do.');
   END IF;
END;

最初または最後のコレクション要素の検索

于 2013-06-02T06:22:49.847 に答える