I hope you will forgive me for a late addendum.
Not only do I have to apologize for the late arrival of this post, I also
should apologize for its (lack of) seriousness.
Actually - this is in every respect just a programming scherzo, so to speak.
(Even though the code below works, at least for me)
Now you are all warned. ;-)
So: If you are used to letting MARC::Batch read the records from a file, then
you can simply read from your database (i.e. your statement handle) like you
were reading from a file.
Like this:
<code>
#!/usr/local/bin/perl -w
use DBI;
use MARC::Batch;
use strict;
#BEGIN {
# $ENV{NLS_LANG} = ...;
#}
my $dbh = DBI->connect(...) || die 1;
$dbh->{LongReadLen} = 99999;
$dbh->{LongTruncOk} = 0;
my $sql = q( select GetBibBlob(bib_id) from bib_master where rownum <= 3 );
my $sth = $dbh->prepare($sql) || die 2;
my $rv = $sth->execute() || die 3;
# add some magic:
tie(*MARC, 'dbfile', $sth);
# pass the virtual filehandle to MARC::Batch
my $batch = MARC::Batch->new('USMARC', *MARC );
$batch->strict_off;
# read as usual
while ( my $marc = $batch->next ) {
print $marc->as_formatted(), "\n\n";
}
#---------------
package dbfile;
use strict;
sub TIEHANDLE {
my ($class, $sth) = @_;
my $i = { 'sth' => $sth,
'eof' => 0, };
bless $i, $class;
}
sub READLINE {
my ($marc) = $_[0]->{sth}->fetchrow_array() ;
if (defined $marc) {
my $len = substr($marc,0,5);
return substr($marc,0,$len);
}
else {
$_[0]->{'eof'} = 1;
return undef;
}
}
sub EOF {
# eof()
$_[0]->{'eof'};
}
sub FILENO {1}
sub BINMODE {1}
sub CLOSE {1}
sub DESTROY {1}
__END__
</code>
That's all folks,
/Leif
Leif Andersson, Systems Librarian
Stockholm University Library
________________________________________
Från: Doran, Michael D [[email protected]]
Skickat: den 7 januari 2011 15:11
Till: Leif Andersson; 'Jon Gorman'; perl4lib
Ämne: RE: MARC blob to MARC::Record object
Hi Leif and Jon,
> use MARC::Record;
> ...
> my $record = MARC::Record->new_from_usmarc( $blob );
This works!
> From: Jon Gorman [mailto:[email protected]]
> Sent: Friday, January 07, 2011 7:51 AM
> You'll probably think of this when you get up, but did you make sure
> to import the package? ie use MARC::FILE::USMARC;?
This made the other way work, too! (I had only "use MARC::File")
Much thanks to Leif and Jon.
-- Michael
# Michael Doran, Systems Librarian
# University of Texas at Arlington
# 817-272-5326 office
# 817-688-1926 mobile
# [email protected]
# http://rocky.uta.edu/doran/
> -----Original Message-----
> From: Leif Andersson [mailto:[email protected]]
> Sent: Friday, January 07, 2011 7:50 AM
> To: Doran, Michael D; perl4lib
> Subject: Re: MARC blob to MARC::Record object
>
> Hi Michael,
>
> this is how I - in principle - usually do it:
>
> use MARC::Record;
> ...
> my $record = MARC::Record->new_from_usmarc( $blob );
>
> /Leif
>
> Leif Andersson, Systems librarian
> Stockholm University Library
> ________________________________________
> Från: Doran, Michael D [[email protected]]
> Skickat: den 7 januari 2011 00:18
> Till: perl4lib
> Ämne: MARC blob to MARC::Record object
>
> I am working on a Perl script that retrieves data from our Voyager ILS via an
> SQL query. Among other data, I have MARC records in blob form, and the script
> processes one MARC record at a time. I want to be able to parse and
> modify/convert the MARC record (using MARC::Record) before writing/printing
> data to a file.
>
> How do I make the MARC blob into a MARC::Record object (without having to
> first save it a file and read it in with MARC::File/Batch)? The MARC blob is
> already in a variable, so it doesn't make sense (to me) to write it out to a
> file just so I can read it back in. Unless I have to, natch.
>
> I apologize if I am missing something obvious.
>
> -- Michael
>
> # Michael Doran, Systems Librarian
> # University of Texas at Arlington
> # 817-272-5326 office
> # 817-688-1926 mobile
> # [email protected]
> # http://rocky.uta.edu/doran/