From: Tomas H. <kvi...@se...> - 2005-08-25 10:55:31
|
I have a problem retrieving BLOBs from Oracle. The trouble is that the oracle module returns LOBs as zero terminated strings (at the low level). The BLOB is truncated if it contains zero byte. Have anybody come across this problem? Sample code: (oracle:run-sql "select id, doc from tab" (oracle:do-rows (id doc) (princ (type-of doc)) ;; THE PROBLEM IS HERE ALREADY (with-open-file (stream (format nil "~a/~a.pdf" dir id) :direction :output :if-exists :supersede :element-type '(unsigned-byte 8)) (write-byte-sequence (convert-string-to-bytes (coerce doc 'string) CUSTOM:*FOREIGN-ENCODING*) stream)))) I can think of some solutions to this: 1) Return BLOBs as byte array: needs to change oracle module both in C and Lisp:-( Might be a lot of work especially when I'm not familiar with low level details of CLisp. This would be ideal solution. 2) Retrieve BLOBs as text, e.g. "select id, doc, utl_encode.base64_encode(doc) as txt from tab". However, this works for short BLOBs only (about 2kB?). Any ideas? Thanks a lot, Tomas |
From: Sam S. <sd...@gn...> - 2005-08-25 15:59:13
|
> * Tomas Hlavaty <xiv...@fr...> [2005-08-25 11:55:30 +0100]: > > I have a problem retrieving BLOBs from Oracle. > > The trouble is that the oracle module returns LOBs as zero terminated > strings (at the low level). The BLOB is truncated if it contains zero > byte. if BLOB can contain a NULL byte, it is wrong to return it as a string. > 1) Return BLOBs as byte array: needs to change oracle module both in C > and Lisp:-( Might be a lot of work especially when I'm not familiar > with low level details of CLisp. This would be ideal solution. indeed. -- Sam Steingold (http://www.podval.org/~sds) running w2k <http://www.honestreporting.com> <http://www.mideasttruth.com/> <http://www.camera.org> <http://www.savegushkatif.org> <http://truepeace.org> Illiterate? Write today, for free help! |
From: Tomas H. <kvi...@se...> - 2005-08-25 16:07:47
|
> Sam Steingold wrote: > >>* Tomas Hlavaty <xiv...@fr...> [2005-08-25 11:55:30 +0100]: >> >>I have a problem retrieving BLOBs from Oracle. >> >>The trouble is that the oracle module returns LOBs as zero terminated >>strings (at the low level). The BLOB is truncated if it contains zero >>byte. > > > if BLOB can contain a NULL byte, it is wrong to return it as a string. Yes, I know;-) but that's the way it is currently implemented in the oracle module:-( >>1) Return BLOBs as byte array: needs to change oracle module both in C >> and Lisp:-( Might be a lot of work especially when I'm not familiar >> with low level details of CLisp. This would be ideal solution. > > indeed. I was just wondering whether somebody haven't solved the problem:-) Thanks, Tomas |
From: Tomas H. <kvi...@se...> - 2005-08-26 10:25:52
|
Hi John, > let me see if I can fix the Oracle interface to return BLOB's as an > array of unsigned byte or more appropriate type. it would be great:-) > There are other limits as well; if your BLOBs are really big (won't > fit in memory) there is no way to fetch them out of Oracle in chunks > (piecewise) ... the module assumes they will fit in memory. It will > not, however, attempt to use up any more than a configurable maximum, > but instead raise an error. But there is no practical way to retrieve > really huge BLOBs or CLOBs that do not fit in memory. This restriction is reasonable. > If I don'thave a quick fix, I'll document it as unsupported since as > Sam points out it is quite wrong to just truncate it. Thanks a lot, Tomas |
From: Tomas H. <kvi...@se...> - 2005-08-30 15:26:28
|
Hi John, > Tomas, a fix in the CVS head; you will have to update your source and > recompile. CLISP's oracle module should now convert data for columns > of type BLOB and BFILE to an array of (UNSIGNED-BYTE 8), and not > truncate it at NUL byte as it was doing. works fine:-) Thanks a lot! Tomas |