PL / SQL:配列内の要素をカウントする最良の方法?


14

これを考えると:

DECLARE
  TYPE T_ARRAY IS TABLE OF VARCHAR2(2000) INDEX BY BINARY_INTEGER;
  MY_ARRAY T_ARRAY;
  V_COUNT INTEGER;

やりたいこと:

BEGIN
  -- ... some code filling the MY_ARRAY array

  -- obviously COUNT_ELEMENTS() does not exists, this is what I'm looking for :-)
  V_COUNT := COUNT_ELEMENTS(MY_ARRAY);

  DBMS_OUTPUT.PUT_LINE('My array containts ' || V_COUNT || ' elements.');
END;

カウンタをインクリメントする基本的なループを実行するプロシージャを作成するよりも良いものはありますか?PL / SQLネイティブ関数がすでにこれを行っているのCOUNT_ELEMENTS()でしょうか?

回答:


26

私はこれがあなたが求めていることだと思う:

V_COUNT := MY_ARRAY.COUNT;

8

幸いなことに、私は維持しなければならない既存のPL / SQLコードで、動作する「ネイティブ」動作を見つけました。

V_COUNT := MY_ARRAY.COUNT;

トリックを行う必要があります。

Googleでこれを見つけるのは非常に困難です。なぜなら、「カウント」はSELECT COUNT(...)SQLクエリで見つけられるものをより頻繁に参照しているからです...


5
そして、ここにドキュメントへのリンクがあります:-)
ジャックダグラス

5

Nested-Tableの場合(つまりなしINDEX BY BINARY_INTEGER)、CARDINALITYも使用できます

V_COUNT := CARDINALITY(MY_ARRAY);

重要な違い:Nested-TableがNULLの場合COUNT、例外を発生させ、CARDINALITYNULLを返します。


CARDINALITYの+1。cardinality()はVARRAYでは機能しませんが:(
Tagar

2
declare
   type array_t is varray(10) of number(10);
   array array_t := array_t(1,2,3,4,5,6,7,8,9,10);
c number(10):=0;
b number(10):=0;
begin<<outer>>
   for i in 1..array.count loop
    if( mod(i,2)=0)
then
 c:=c+i;
end if;
   end loop;
dbms_output.put_line(c);
begin
    for i in 1..array.count loop
 if( mod(i,2)<>0)
then
 b:=b+i;
end if;
   end loop;
dbms_output.put_line(b);
end;
end outer;
/

タイプ「array_t」には「array」とは異なる変数名を使用します。「配列」が型ではなく変数であることに気づくまで、コードで20分間苦労しました(C、C#、およびJava alotを使用しているため)。
-justdan23

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.