RE: odbc_lob_read chunk is short

Martin Gainty <[email protected]>
Newsgroups gmane.comp.lang.perl.modules.dbi.general
Message-ID <[email protected]>
"odbc_lob_read(sth, colno, buf, length, \%attrs)
where \%attrs can contain TYPE => SQL_type."
http://www.nntp.perl.org/group/perl.dbi.dev/2010/07/msg6140.html


where Type should be SQLBINARY

http://www.nntp.perl.org/group/perl.dbi.dev/2010/09/msg6258.html


"It turns out I was mistaken as DBD::Oracle DOES implement blob read
although I've not tested it works. Someone, in the distant past
attempted an implementation in DBD::ODBC but it does NOT work and is
seriously flawed."
http://www.nntp.perl.org/group/perl.dbi.dev/2010/07/msg6144.html

Martin 
______________________________________________ 
"Confusion and Obfuscation directives from Corporate can be disregarded for OpenSource implementations"..Latest Memo

  



> Date: Fri, 6 Sep 2013 09:18:57 +0100
> From: [email protected]
> To: [email protected]
> Subject: Re: odbc_lob_read chunk is short
> 
> On 05/09/13 20:28, Mike Grau wrote:
> > Hello,
> >
> > I am completely new at this, but I am trying to read a BLOB in chunks
> > via ODBC in Oracle 11g using DBD::ODBC-1.43, unixODBC-2.3.1 and
> > oracle-instantclient11.2-odbc-11.2. I can read an entire BLOB in one
> > read and write it to the filesystem, but I really need to be able to do
> > it in chunks, I think.
> >
> > Reading the BLOB in chunks, but I am always getting one byte less than
> > requested, losing the last byte, which results in a corrupt document (a
> > PDF) when written to the filesystem. I'm at a loss as to why this is
> > happening and how to correct it.
> >
> > Using this snippet based on the example provided by DBD::ODBC...
> >
> > while($len = $s->odbc_lob_read(1, \my $x, 8, {TYPE => 999})) {
> > print "len=$len, x=$x\n";
> > }
> >
> > ... produces this output:
> >
> > len=7, x=435886
> > len=7, x=0000 n
> > len=7, x=0001282
> > len=7, x=60 0000
> >
> > And a tracefile shows the same.
> >
> > SQLGetData(col=1,type=-2)=1 (retlen=2046252)
> > <- odbc_lob_read= ( 7 ) [1 items] at /root/lob_read.pl line 45
> > >> odbc_lob_read DISPATCH (DBI::st=HASH(0x203c940) rc1/1 @5 g2 ima0
> > pid#11494) at /root/lob_read.pl line 45
> > -> odbc_lob_read for DBD::ODBC::st (DBI::st=HASH(0x203c940)~0x203c9d0 1
> > SCALAR(0x1e0a440) 8 HASH(0x203c970)) thr#1cea010
> > SQLGetData(col=1,type=-2)=1 (retlen=2046244)
> > <- odbc_lob_read= ( 7 ) [1 items] at /root/lob_read.pl line 45
> > >> odbc_lob_read DISPATCH (DBI::st=HASH(0x203c940) rc1/1 @5 g2 ima0
> > pid#11494) at /root/lob_read.pl line 45
> > -> odbc_lob_read for DBD::ODBC::st (DBI::st=HASH(0x203c940)~0x203c9d0 1
> > SCALAR(0x1e0a440) 8 HASH(0x203c9a0)) thr#1cea010
> >
> > Can someone please give me some guidance how to get the full chunk
> > requested?
> >
> > I'm using
> > unixODBC-2.3.1 - built from the tarball
> > DBD-ODBC-1.43 - installed from the tarball (perl Makefile.PL; make;
> > make install)
> > oracle-instantclient11.2-odbc-11.2.0.3 installed from RPM
> > DBI is the distro's perl-DBI-1.617-4.1.1.x86_64 (openSUSE 12.3)
> > The database and client are both x86_64
> >
> > The instant client is link against libodbcinst.so.1 and unixODBC now
> > provides libodbcinst.so.2, so I symlinked them:
> > libodbcinst.so.1 -> /usr/local/lib64/libodbcinst.so.2
> > Ugly, but seems to work.
> >
> > Ultimately I want to index documents stored in Oracle with Sphinx and so
> > must use ODBC. I'd like to know that this much is working before moving
> > on to Sphinx.
> >
> > TIA -- Mike G.
> >
> 
> Bear with me and I'll take another look at that code. If I cannot see anything I might need to send you a new version with slightly different logging. By all means nag me if I don't get back to you by tomorrow.
> 
> Martin
> -- 
> Martin J. Evans
> Easysoft Limited
> http://www.easysoft.com
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.