2010-09-02 8 views
2

J'ai besoin de lire les octets de ce blob. Je suis en train de ce qui suit, mais je reçois cette exception: oracle.sql.BLOB ne peut pas être jeté à [BClojure lire Blob de la base de données

(defn select-test2[] 
    (clojure.contrib.sql/with-connection db 
    (with-query-results res ["SELECT my_blob from some_table"] (doall res)))) 

(defn obj [byte-buffer] 
    (if-not (nil? byte-buffer) 
    (with-open [object-in (ObjectInputStream. 
          (ByteArrayInputStream. byte-buffer))] 
     (.readObject object-in)))) 

(obj (:my_blob (first (select-test2)))) 

Répondre

2

[B est la « classe » d'un tableau d'octets:

 
user=> (type (byte-array 0)) 
[B 

Il y a donc une place dans votre code qui attend un tableau d'octets, mais il reçoit une instance oracle.sql.Blob. Mon pari est que :my_blob vous donne un Blob; Lorsque vous transmettez byte-buffer (qui est le Blob) au constructeur ByteArrayInputStream, vous obtenez l'exception.

Recherchez les javadocs pour oracle.sql.Blob pour voir comment extraire un tableau d'octets ou un flux d'entrée à partir de celui-ci.

3
(ns test-jdbc 
    (:use clojure.contrib.sql)) 

; read clob with BufferedReader 
(defn clob-to-string [clob] 
    (with-open [rdr (java.io.BufferedReader. (.getCharacterStream clob))] 
    (apply str (line-seq rdr)))) 

; read first CLOB 
(defn get-meta-by-id [db id] 
    "read META_COL from MY_TABLE by given id" 
    (with-connection db 
    (transaction ;; need to be inside a transaction 
     (with-query-results rs 
     ["select META_COL from MY_TABLE where ID = ? " id] 
     (clob-to-string (:meta-col (first rs))))))) 
+0

Zmila, je voulais savoir sur un blob, pas un CLOB. – aQ123

Questions connexes