2017-05-31 3 views
1

以下のコードをご覧ください。コレクションの4番目の要素はnullなので、変数が存在しないと予想しています。しかし、まだ、私はが存在する場合にTRUEになります関数です。これがなぜ起こっているのかを明確にしてください。Oracleコレクション関数 - 期待した結果が得られません

DECLARE type nt is varray(5) of varchar2(5); nt1 nt := nt(); BEGIN nt1.extend(5); nt1 :=nt('ant','ball','cat',null,'elm'); for i in nt1.first..nt1.last loop dbms_output.put_line(nt1(i)); end loop; if nt1.exists(4) then dbms_output.put_line('TRUE'); end if; END;

私は真と評価するために存在する機能のために、その変数を単に拡張した場合には、十分ですか?

+0

' 型NTがVARCHAR2(5)のVARRAY(5)でDECLAREを。 nt1 nt:= nt(); BEGIN nt1.extend(3); nt1:= nt( 'ant'、 'ball'、 'cat'); - 、null、 'elm'); for i for nt1.first..nt1.last ループ dbms_output.put_line(nt1(i)); エンドループ。 の場合 nt1.exists(4)次にdbms_output.put_line( 'TRUE'); else dbms_output.put_line( 'FALSE'); end if; END; ' このコードは、まだその変数を拡張していないため、FALSEと評価されます。 – Natty

答えて

1

要素が存在し、その値のみがnullです。

nt1.extend(5); 

あなたはまだnt1.exists(4)が真である、5つのエントリを作成します。 VARRAYにはギャップがないので、existsは、配列がその位置までいっぱいになっているかどうかだけを伝えます。 (それがあるなら、あなたは安全にその要素にアクセスすることができます。)

if nt1.exists(4) then 
    if nt1(4) is null then 
    dbms_output.put_line('Entry 4 is empty (null)'); 
    else 
    dbms_output.put_line('Entry 4 has value' || nt1(4)); 
    end if; 
else 
    dbms_output.put_line('Array not filled up till 4th element, yet'); 
end if; 
関連する問題