sql >> データベース >  >> RDS >> Oracle

NUMBER_ARRAYのpreparedStatement設定nullが機能しない

    null配列、空の配列、および単一のNULLのみを含む配列について混乱しているようです。 値。

    NULL 配列は、NULLと同じように、配列が存在しないことです。 数は数がないことです。空の配列は存在する配列ですが、その中に0個の要素があります。どちらもNUMBER_ARRAY(null)とは異なります 、これは単一のNULLを含む配列です 値。

    COUNT 配列内の要素の数を返す配列のメソッドは、これら3つの違いを示しています。

    まず、NULL 配列:

    SQL> declare
      2    l_null_array     number_array  := null;
      3  begin
      4    dbms_output.put_line('Count: ' || l_null_array.COUNT);
      5  end;
      6  /
    declare
    *
    ERROR at line 1:
    ORA-06531: Reference to uninitialized collection
    ORA-06512: at line 4
    

    ここで、エラーが発生します。 l_null_arrayに要素がいくつあるかわかりません の要素の数を見つけるための配列がないためです。

    次に、空の配列:

    SQL> declare
      2    l_empty_array    number_array  := number_array();
      3  begin
      4    dbms_output.put_line('Count: ' || l_empty_array.COUNT);
      5  end;
      6  /
    
    Count: 0
    
    PL/SQL procedure successfully completed.
    

    ここで、空の配列内の要素の数を見つけることができ、その数はゼロです。

    最後に、NULLのみを含む配列 :

    SQL> declare
      2    l_array_containing_null    number_array  := number_array(null);
      3  begin
      4    dbms_output.put_line('Count: ' || l_array_containing_null.COUNT);
      5  end;
      6  /
    Count: 1
    
    PL/SQL procedure successfully completed.
    

    この配列には1つの要素があり、その1つの要素はNULLです。 。

    NUMBER_ARRAYにはいくつでも引数を渡すことができることに注意してください コンストラクター関数であり、これらの値は配列の初期コンテンツになります。例:NUMBER_ARRAY(1, 4, 18, 11, 22, 6) 6つの要素を含む数値配列を作成します。

    では、JDBCを使用して各種類の配列を設定するにはどうすればよいでしょうか。

    • NULLを設定するには 配列、使用

      ps.setNull(i, Types.ARRAY, "NUMBER_ARRAY");
      

      上で行ったように。

    • 空の配列の場合は、次を使用します:

      ps.setArray(i, new ARRAY(arrayDescriptor, conn, new Integer[0]));
      
    • 単一のNULLを含む配列の場合 値のみ、使用

      ps.setArray(i, new ARRAY(arrayDescriptor, conn, new Integer[] { null }));
      

    Integerを使用しています これらの例では配列ですが、他の数値タイプも機能するはずです。




    1. パート2:実際にピボットせずにパーティションベースのクエリの合計を取得する方法

    2. PLSQL-トリガーにIinsertを挿入すると、再帰ループが発生します

    3. MySQL:1日あたり各ユーザーからの1から最大nの投稿を表示する必要があります

    4. Doctrine2.3とOneToOneカスケードが持続しないようです