Clojure читать Blob из базы данных - PullRequest
2 голосов
/ 02 сентября 2010

Мне нужно прочитать байты из этого BLOB-объекта. Я пытаюсь следующее, но я получаю это исключение: oracle.sql.BLOB не может быть приведен к [B

(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))))

Ответы [ 2 ]

3 голосов
/ 03 сентября 2010
(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))) ))))
2 голосов
/ 03 сентября 2010

[B - это "класс" байтового массива:

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

Так что в вашем коде есть место, которое ожидает байтовый массив, но ему дается экземпляр oracle.sql.Blob.Я держу пари, что :my_blob дает вам Blob;когда вы передаете byte-buffer (то есть Blob) в конструктор ByteArrayInputStream, вы получаете исключение.

Просмотрите javadoc для oracle.sql.Blob, чтобы увидеть, как извлечь байтовый массив или вводпоток из него.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...