Oracle
 sql >> Base de données >  >> RDS >> Oracle

Le paramètre readyStatement null pour NUMBER_ARRAY ne fonctionne pas

Il semble que vous ayez une certaine confusion à propos des tableaux nuls, des tableaux vides et des tableaux qui ne contiennent qu'un seul NULL valeur.

Un NULL array est l'absence de tableau, de la même manière qu'un NULL le nombre est l'absence de nombre. Un tableau vide est un tableau qui existe, mais qui contient 0 éléments. Les deux sont différents de NUMBER_ARRAY(null) , qui est un tableau contenant un seul NULL valeur.

Le COUNT méthode sur un tableau, qui renvoie le nombre d'éléments dans le tableau, fournit une illustration des différences entre ces trois.

Tout d'abord, un NULL tableau :

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

Ici, nous obtenons une erreur. Nous ne pouvons pas savoir combien d'éléments il y a dans l_null_array car nous n'avons pas de tableau pour trouver le nombre d'éléments de.

Deuxièmement, un tableau vide :

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.

Ici, nous pouvons trouver le nombre d'éléments dans un tableau vide, et ce nombre est zéro.

Enfin, un tableau contenant uniquement 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.

Ce tableau contient un élément, et cet élément est NULL .

Notez que vous pouvez passer autant d'arguments que vous le souhaitez au NUMBER_ARRAY fonction constructeur, et ces valeurs seront le contenu initial du tableau. Par exemple, NUMBER_ARRAY(1, 4, 18, 11, 22, 6) crée un tableau de nombres avec 6 éléments.

Alors, comment pouvons-nous définir chaque type de tableau à l'aide de JDBC ?

  • Pour définir un NULL tableau, utilisez

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

    comme vous l'avez fait ci-dessus.

  • Pour un tableau vide, utilisez :

    ps.setArray(i, new ARRAY(arrayDescriptor, conn, new Integer[0]));
    
  • Pour un tableau contenant un seul NULL valeur uniquement, utilisez

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

J'utilise un Integer tableau dans ces exemples, mais d'autres types numériques devraient également fonctionner.