2 votes

Clojure contrib sql transforme tous les nombres en BigDecimal

La bibliothèque clojure.contrib.sql renvoie des BigDecimals pour tous les champs numériques. Quelle est la bonne façon d'avoir certains champs en tant qu'entiers ? Exemple de code ci-dessous :

(sql/with-connection my-db 
   (sql/with-query-results res 
      [sql-str 6722] 
      (into [] res)))

Dans la collection d'enregistrements qui en résulte, tous les chiffres sont des BigDecimal. Certains d'entre eux sont des clés étrangères, et pour des raisons qui me sont propres, j'ai besoin qu'ils soient entiers.

Je sais que je peux itérer sur la collection et les convertir, mais je préférerais ne pas le faire car il s'agit d'une très grande collection, et il semble juste que la bibliothèque utilise ResultsSet.getInteger si le nombre correspond à un nombre entier.

La base de données est Oracle, et les champs entiers de la base sont définis comme NUMBER(10).

Merci

3voto

Alex Taggart Points 5733

Comme l'a fait remarquer atreyu, un nombre entier à 10 chiffres ne rentrera pas nécessairement dans le cadre d'un fichier de type Integer .

Plus important encore, le seq qui vous est donné est créé par clojure.core/resultset-seq qui, à son tour, appelle ResultSet.getObject(int) . Conformément à la spécification JDBC, l'élément BigDecimals sont retournés parce que c'est le type java qui correspond au type SQL de la colonne.

De plus, vous n'avez pas besoin de vous soucier de "l'itération sur la collection". Le resultset-seq est paresseux, et map est paresseux, donc vous finirez par convertir chaque nombre juste avant de les consommer. Par exemple,

(sql/with-connection my-db 
   (sql/with-query-results res 
      \[sql-str 6722\] 
      (do-stuff 
         (map (comp int :id) res))))

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X